小编Vy.*_*.Iv的帖子

Scrapy规则如何与爬行蜘蛛一起使用

我很难理解scrapy爬行蜘蛛的规则.我的例子不能像我希望的那样工作,所以它可以是两件事:

  1. 我不明白规则如何运作.
  2. 我形成了不正确的正则表达式,阻止我得到我需要的结果.

好的,这就是我想做的事情:

我想编写爬虫蜘蛛,它将从http://www.euroleague.net网站获取所有可用的统计信息.托管我开始所需的所有信息的网站页面就在这里.

步骤1

我想的第一步是提取"季节"链接并休闲.这里是我打算匹配的HTML/href(我想逐个匹配"季节"部分中的所有链接,但我认为以一个链接为例更容易):

href="/main/results/by-date?seasoncode=E2001"
Run Code Online (Sandbox Code Playgroud)

这是我为它创建的规则/正则表达式:

Rule(SgmlLinkExtractor(allow=('by-date\?seasoncode\=E\d+',)),follow=True),
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

第2步

当我被蜘蛛带到网页http://www.euroleague.net/main/results/by-date?seasoncode=E2001的第二步时,我希望蜘蛛从"常规季节"部分中提取链接.在这种情况下,我们可以说它应该是"第1轮".我正在寻找的HTML/href是:

<a href="/main/results/by-date?seasoncode=E2001&gamenumber=1&phasetypecode=RS"
Run Code Online (Sandbox Code Playgroud)

我构建的rule/regex将是:

Rule(SgmlLinkExtractor(allow=('seasoncode\=E\d+\&gamenumber\=\d+\&phasetypecode\=\w+',)),follow=True),
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

第3步

现在我到达页面(http://www.euroleague.net/main/results/by-date?seasoncode=E2001&gamenumber=1&phasetypecode=RS)我准备提取链接,这些链接指向包含我需要的所有信息的页面:我正在寻找HTML/href:

href="/main/results/showgame?gamenumber=1&phasetypecode=RS&gamecode=4&seasoncode=E2001#!boxscore"
Run Code Online (Sandbox Code Playgroud)

我必须遵循的正则表达式是:

Rule(SgmlLinkExtractor(allow=('gamenumber\=\d+\&phasetypecode\=\w+\&gamecode\=\d+\&seasoncode\=E\d+',)),callback='parse_item'),
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

问题

我认为爬虫应该像这样工作:规则爬虫就像一个循环.当第一个链接匹配时,爬虫将跟随"步骤2"页面,而不是"步骤3",之后它将提取数据.执行此操作后,它将返回"步骤1"以匹配第二个链接并再次开始循环到第一步中没有链接的点.

我从终端看到的似乎是爬虫在"步骤1"中循环.它遍历所有"步骤1"链接,但不涉及"步骤2"/"步骤3"规则.

2014-02-28 00:20:31+0200 [basketsp_test] DEBUG: Crawled (200) <GET http://www.euroleague.net/main/results/by-date?seasoncode=E2000> (referer: http://  www.euroleague.net/main/results/by-date)
2014-02-28 00:20:31+0200 [basketsp_test] DEBUG: Crawled (200) <GET http://www.euroleague.net/main/results/by-date?seasoncode=E2001> (referer: http://www.euroleague.net/main/results/by-date)
2014-02-28 00:20:31+0200 [basketsp_test] DEBUG: Crawled (200) <GET http://www.euroleague.net/main/results/by-date?seasoncode=E2002> (referer: http://www.euroleague.net/main/results/by-date)
2014-02-28 00:20:32+0200 [basketsp_test] DEBUG: Crawled (200) <GET http://www.euroleague.net/main/results/by-date?seasoncode=E2003> (referer: http://www.euroleague.net/main/results/by-date)
2014-02-28 00:20:33+0200 [basketsp_test] DEBUG: Crawled (200) <GET …
Run Code Online (Sandbox Code Playgroud)

python regex web-crawler scrapy

20
推荐指数
3
解决办法
1万
查看次数

PYTHON SCRAPY无法向FORMS发布信息,

我认为,几天后我一直在努力解决这个问题.我尝试了所有可能的(以我的最佳知识)方式但仍然没有结果.我做错了什么,但仍然无法弄清楚它是什么.非常感谢每一位愿意参加这次冒险的人.首先要做的事情是:我正在尝试使用POST方法将信息发布到delta.com上的表单.与这些网站一样,它很复杂,因为它们在会话,cookie和Javascript中,所以它可能是那里的问题.我正在使用我在stackoverflow中找到的代码示例: 使用MultipartPostHandler使用Python POST表单数据 这里是我为delta网页调整的代码.

from scrapy.selector import HtmlXPathSelector
from scrapy.http import FormRequest, Request
from delta.items import DeltaItem
from scrapy.contrib.spiders import CrawlSpider, Rule


class DmozSpider(CrawlSpider):
    name = "delta"
    allowed_domains = ["http://www.delta.com"]
    start_urls = ["http://www.delta.com"]

    def start_requests(self, response):
        yield FormRequest.from_response(response, formname='flightSearchForm',url="http://www.delta.com/booking/findFlights.do", formdata={'departureCity[0]':'JFK', 'destinationCity[0]':'SFO','departureDate[0]':'07.20.2013','departureDate[1]':'07.28.2013','paxCount':'1'},callback=self.parse1)

    def parse1(self, response):
        hxs = HtmlXPathSelector(response)
        sites = hxs.select('//')
        items = []
        for site in sites:
            item = DeltaItem()
            item['title'] = site.select('text()').extract()
            item['link'] = site.select('text()').extract()
            item['desc'] = site.select('text()').extract()
            items.append(item)
        return items
Run Code Online (Sandbox Code Playgroud)

当我指示蜘蛛在终端爬行时,我看到:

 scrapy crawl delta -o items.xml  -t xml …
Run Code Online (Sandbox Code Playgroud)

python forms post scrapy web-scraping

8
推荐指数
1
解决办法
6596
查看次数

从Python中的构造函数__init__中反省参数

什么是在__init__不创建新实例的情况下从中提取参数的方法.代码示例:

class Super:
    def __init__(self, name):
        self.name = name
Run Code Online (Sandbox Code Playgroud)

我看起来像Super.__dict__.keys()类型解决方案.只是为了检索名称参数信息而不添加任何值.有这样的选择吗?

python oop arguments introspection

5
推荐指数
1
解决办法
6196
查看次数

Python列表在哪里保存其值?

从自省的角度来看,列表值位于类对象中。如果列表对象是python中的类:

>>> a = ['one', 'two']
>>> type(a)
<class 'list'>
Run Code Online (Sandbox Code Playgroud)

所以它存储在类的某个地方,但是在哪里?

例如:如果我们用值定义一个类:

class Test:
    def __init__(self):
        self.test_name = "Do Not"
        self.test_surname = "Know"
Run Code Online (Sandbox Code Playgroud)

找到实例值很容易:

>>> b = Test()
>>> print(a.__dict__)
{'test_surname': 'Know', 'test_name': 'Do not'}
Run Code Online (Sandbox Code Playgroud)

是否有类似的选项可以在列表类对象中达到这些值?

python oop dictionary list python-internals

3
推荐指数
1
解决办法
158
查看次数

如何获取 Python 中给定类的成员列表?

这是我想要得到的:

class Foo:

    def __init__(self, test1, test2, test3):
     self.test1=test1
     self.test2=test2
     self.test3=test3
Run Code Online (Sandbox Code Playgroud)

有没有办法获取成员变量名称列表?

类似于 dir() 函数的东西,但不是这样的:

dir(Foo)
['__doc__', '__init__', '__module__']
Run Code Online (Sandbox Code Playgroud)

你将会拥有:

something(Foo)
['test1', 'test2', 'test3']
Run Code Online (Sandbox Code Playgroud)

python

0
推荐指数
1
解决办法
1785
查看次数