python-3.x - 使用scrapy规则访问“下一页”
问题描述
我最近回到了几个月前制作的scrapy代码。
代码的目的是抓取一些亚马逊产品的数据,它的工作原理是这样的:
让我们以这个页面为例
代码所做的是输入该页面的每个产品并从中获取数据,在完成从该页面抓取所有数据后,它移动到下一个(在本例中为第 2 页)。
最后一部分停止工作。
我在规则中有这样的东西(我不得不重新编写一些 xpath,因为它们已经过时了)
import scrapy
import re
import string
import random
from scrapy.spiders import CrawlSpider, Rule
from scrapy.linkextractors import LinkExtractor
from scrapyJuan.items import GenericItem
from scrapy.exceptions import CloseSpider
from scrapy.http import Request
class GenericScraperSpider(CrawlSpider):
name = "generic_spider"
#Dominio permitido
allowed_domain = ['www.amazon.com']
search_url = 'https://www.amazon.com/s?field-keywords={}'
custom_settings = {
'FEED_FORMAT': 'csv',
'FEED_URI' : 'GenericProducts.csv'
}
rules = {
#Next button
Rule(LinkExtractor(allow =(), restrict_xpaths = ('//li[@class="a-last"]/a/@href') )),
#Every element of the page
Rule(LinkExtractor(allow =(), restrict_xpaths = ('//a[contains(@class, "a-link-normal") and contains(@class,"a-text-normal")]') ),
callback = 'parse_item', follow = False)
}
def start_requests(self):
txtfile = open('productosGenericosABuscar.txt', 'r')
keywords = txtfile.readlines()
txtfile.close()
for keyword in keywords:
yield Request(self.search_url.format(keyword))
def parse_item(self,response):
这就像一个月前一样工作,但我现在不能让它工作。
有什么想法吗?
解决方案
亚马逊有一个反机器人机制,可以在一些迭代后请求验证码。您可以确认它检查返回的 HTTP 代码,如果它正在等待验证码,您应该会收到类似503 Service Unavailable
. 我在您的代码片段上没有看到任何错误(除了{}
代替()
on rules
,这实际上不会影响结果,因为您仍然可以迭代它)。
此外,确保你的蜘蛛是继承的CrawlSpider
,而不是Scrapy
推荐阅读
- c# - 如果我从列表中删除元素 - 这是否意味着我的 RAM 也通过垃圾收集器或以某种方式被清除/释放?
- reactjs - 反应路由器页面不会停止重新加载
- python-3.x - 如何为熊猫列中的每个列表附加不同的元素?
- virtual-machine - 如何连接到外部部署的 Hyperledger Fabric 网络?
- mysql - 计数查询的 MySQL 查询优化
- python - 张量板连接问题
- markdown - 在 mkdocs 中渲染上标
- flutter - Flutter 中用于 PayPal 支付的 Braintree 集成
- c - 在 c 中的套接字编程中读取或写入后没有代码运行
- c# - 使用代码从 Dynamics365 获取所有实体