我正在尝试使用scrapy进行递归网页抓取。我想转到“https://www.doz.pl/apteka/k17_1-Przeciwbolowe”,按照下一步按钮获取此网站上的所有产品名称和价格。
我能够创建这个蜘蛛(它正常工作):
import scrapy
from DOZ2.items import prodItem
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule
class DmozSpider(scrapy.Spider):
name = "DOZ2"
allowed_domains = ["doz.pl"]
start_urls = ["https://www.doz.pl/apteka/k17_1-Przeciwbolowe"]
def parse(self, response):
for sel in response.xpath('//div[@class="details"]'):
i=prodItem()
i['price'] = sel.xpath('div[@class="price"]/span/text()').extract()[0]
i['name'] = sel.xpath('h3/a/text()').extract()[0]
i['link'] = sel.xpath('h3/a/@href').extract()[0]
yield i
if response.xpath('//li[@class="next"]/a/@href'):
url= response.xpath('//li[@class="next"]/a/@href').extract()[0]
url= ''.join(['https://www.doz.pl', url])
request = scrapy.Request(url=url)
yield request
但是为了使代码更专业,根据这个post,我想通过实现'规则'来实现。我在示例中更改了代码,但它不起作用。它甚至无法从主页面获取数据。
# -*- coding: iso-8859-2 -*-
import scrapy
from DOZ2.items import prodItem
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule
class DmozSpider(scrapy.Spider):
name = "DOZ2b"
allowed_domains = ["doz.pl"]
start_urls = ["https://www.doz.pl/apteka/k17_1-Przeciwbolowe"]
rules = (Rule(LinkExtractor(allow=(), restrict_xpaths=('//li[@class="next"]/a',)), callback="parse_page", follow= True),)
def parse_page(self, response):
for sel in response.xpath('//div[@class="details"]'):
i=prodItem()
i['price'] = sel.xpath('div[@class="price"]/span/text()').extract()[0]
i['name'] = sel.xpath('h3/a/text()').extract()[0]
i['link'] = sel.xpath('h3/a/@href').extract()[0]
yield i
如果有人能表明我的错误,我的第二段代码不起作用,我将不胜感激?我做了所有必需的更改:创建规则,更改解析函数名称,调整限制路径。
提前感谢您的帮助。
答案 0 :(得分:3)
scrapy中Spiders
很少,所有这些只是扩展scrapy.Spider
并添加一些功能。要使用CrawlSpider,您实际上需要在创建蜘蛛类时继承它:
from scrapy.spiders import CrawlSpider
class MyCrawlSpider(CrawlSpider):
name = 'crawlspider1'
rules = ... # define your rules here