我已经设法用 Scrapy 编写了一个非常简单的爬虫,具有这些给定的约束:
- 存储所有链接信息(例如:锚文本、页面标题),因此有 2 个回调
- 使用 CrawlSpider 来利用规则,因此没有 BaseSpider
它运行良好,但如果我向第一个请求添加回调,它不会执行规则!
这是我的代码:(工作但不正确,有一个活生生的例子)
from scrapy.contrib.spiders import CrawlSpider,Rule
from scrapy.selector import HtmlXPathSelector
from scrapy.http import Request
from scrapySpider.items import SPage
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor
class TestSpider4(CrawlSpider):
name = "spiderSO"
allowed_domains = ["cumulodata.com"]
start_urls = ["http://www.cumulodata.com"]
extractor = SgmlLinkExtractor()
def parse_start_url(self, response):
#3
print('----------manual call of',response)
self.parse_links(response)
print('----------manual call done')
# 1 return Request(self.start_urls[0]) # does not call parse_links(example.com)
# 2 return Request(self.start_urls[0],callback = self.parse_links) # does not call parse_links(example.com)
rules = (
Rule(extractor,callback='parse_links',follow=True),
)
def parse_links(self, response):
hxs = HtmlXPathSelector(response)
print('----------- manual parsing links of',response.url)
links = hxs.select('//a')
for link in links:
title = link.select('@title')
url = link.select('@href').extract()[0]
meta={'title':title,}
yield Request(url, callback = self.parse_page,meta=meta)
def parse_page(self, response):
print('----------- parsing page: ',response.url)
hxs = HtmlXPathSelector(response)
item=SPage()
item['url'] = str(response.request.url)
item['title']=response.meta['title']
item['h1']=hxs.select('//h1/text()').extract()
yield item
我尝试通过 3 种方式解决此问题:
- 1:返回带有起始 url 的请求 -不执行规则
- 2:与上述相同,但有回调
parse_links
- 相同的问题 - 3:抓取起始地址
parse_links
后parse_start_url
调用,通过实现,函数不会被调用
以下是日志:
----------manual call of <200 http://www.cumulodata.com>)
----------manual call done
#No '----------- manual parsing links', so `parse_links` is never called!
版本
- Python 2.7.2
- Scrapy 0.14.4