gpt4 book ai didi

python - 理解 Scrapy 的 CrawlSpider 规则

转载 作者:太空狗 更新时间:2023-10-29 21:58:31 25 4
gpt4 key购买 nike

我无法理解如何在我自己的从 CrawlSpider 继承的 Spider 中使用规则字段。我的蜘蛛正试图在旧金山的比萨饼黄页列表中爬行。

我试图让我的规则保持简单,只是为了看看蜘蛛是否会爬过响应中的任何链接,但我没有看到它发生。我唯一的结果是它产生对下一页的请求,然后产生对后续页面的请求。

我有两个问题:1. 蜘蛛收到响应后是否先处理规则再调用回调?或相反亦然?2.规则何时适用?

编辑:我想到了。我覆盖了 CrawlSpider 的解析方法。在查看该类中的 parse 方法后,我意识到这是它检查规则并抓取这些网站的地方。

注意:了解您要覆盖的内容

这是我的代码:

from scrapy.contrib.spiders import CrawlSpider, Rule
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor
from scrapy import Selector
from yellowPages.items import YellowpagesItem
from scrapy.http import Request

class YellowPageSpider(CrawlSpider):
name = "yellowpages"
allowed_domains = ['www.yellowpages.com']
businesses = []

# start with one page
start_urls = ['http://www.yellowpages.com/san-francisco-ca/pizza?g=san%20francisco%2C%20ca&q=pizza']

rules = (Rule (SgmlLinkExtractor()
, callback="parse_items", follow= True),
)

base_url = 'http://www.yellowpages.com'

def parse(self, response):
yield Request(response.url, callback=self.parse_business_listings_page)

def parse_items(self, response):
print "PARSE ITEMS. Visiting %s" % response.url
return []

def parse_business_listings_page(self, response):
print "Visiting %s" % response.url

self.businesses.append(self.extract_businesses_from_response(response))
hxs = Selector(response)
li_tags = hxs.xpath('//*[@id="main-content"]/div[4]/div[5]/ul/li')
next_exist = False

# Check to see if there's a "Next". If there is, store the links.
# If not, return.
# This requires a linear search through the list of li_tags. Is there a faster way?
for li in li_tags:
li_text = li.xpath('.//a/text()').extract()
li_data_page = li.xpath('.//a/@data-page').extract()
# Note: sometimes li_text is an empty list so check to see if it is nonempty first
if (li_text and li_text[0] == 'Next'):
next_exist = True
next_page_num = li_data_page[0]
url = 'http://www.yellowpages.com/san-francisco-ca/pizza?g=san%20francisco%2C%20ca&q=pizza&page='+next_page_num
yield Request(url, callback=self.parse_business_listings_page)

最佳答案


所以对于你的两个问题..

  1. 在发出请求之前,会在发出请求之前处理爬虫规则...当然,如果响应不符合允许的域,理论上会收到响应,但只是被丢弃。

  2. 在发出请求之前再次使用爬虫规则。

注意!

在您的示例中,当您调用 parse() 方法时...虽然在您的情况下您使用它是正确的??!必须运行它来确认,但那些阅读的人除非您在 CRAWL 蜘蛛中明确覆盖 parse() 方法……当使用爬网蜘蛛时……蜘蛛中 pare 与爬虫的等价物是 parse_item()。 .. 爬虫中的 parse() 是它自己的逻辑函数...不应该在规则集中用作回调

https://doc.scrapy.org/en/latest/topics/spiders.html

关于python - 理解 Scrapy 的 CrawlSpider 规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25459719/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com