我很难理解scrapy爬行蜘蛛的规则.我的例子不能像我希望的那样工作,所以它可以是两件事:
好的,这就是我想做的事情:
我想编写爬虫蜘蛛,它将从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) 我认为,几天后我一直在努力解决这个问题.我尝试了所有可能的(以我的最佳知识)方式但仍然没有结果.我做错了什么,但仍然无法弄清楚它是什么.非常感谢每一位愿意参加这次冒险的人.首先要做的事情是:我正在尝试使用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) 什么是在__init__
不创建新实例的情况下从中提取参数的方法.代码示例:
class Super:
def __init__(self, name):
self.name = name
Run Code Online (Sandbox Code Playgroud)
我看起来像Super.__dict__.keys()
类型解决方案.只是为了检索名称参数信息而不添加任何值.有这样的选择吗?
从自省的角度来看,列表值位于类对象中。如果列表对象是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)
是否有类似的选项可以在列表类对象中达到这些值?
这是我想要得到的:
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 ×5
oop ×2
scrapy ×2
arguments ×1
dictionary ×1
forms ×1
list ×1
post ×1
regex ×1
web-crawler ×1
web-scraping ×1