python – 使用Scrapy进行爬网 – 不处理或不允许HTTP状态代码?
我想获得类别
https://tiki.vn/dien-thoai-may-tinh-bang/c1789的产品标题,链接,价格
但它失败了“HTTP状态代码未被处理或不被允许” 我的文件:spiders / tiki.py import scrapy from scrapy.linkextractors import LinkExtractor from scrapy.spiders import CrawlSpider,Rule from stackdata.items import StackdataItem class StackdataSpider(CrawlSpider): name = "tiki" allowed_domains = ["tiki.vn"] start_urls = [ "https://tiki.vn/dien-thoai-may-tinh-bang/c1789",] rules = ( Rule(LinkExtractor(allow=r"?page=2"),callback="parse_item",follow=True),) def parse_item(self,response): questions = response.xpath('//div[@class="product-item"]') for question in questions: question_location = question.xpath( '//a/@href').extract()[0] full_url = response.urljoin(question_location) yield scrapy.Request(full_url,callback=self.parse_question) def parse_question(self,response): item = StackdataItem() item["title"] = response.css( ".item-box h1::text").extract()[0] item["url"] = response.url item["content"] = response.css( ".price span::text").extract()[0] yield item 文件:items.py import scrapy class StackdataItem(scrapy.Item): title = scrapy.Field() url = scrapy.Field() price = scrapy.Field() 请帮我!!!!谢谢! 解决方法
TL;博士
您被基于scrapy的用户代理阻止. 您有两种选择: >授予网站的愿望,不要刮掉它们,或者 我假设你想选择2. 转到scrapy项目中的settings.py,并将用户代理设置为非默认值.您自己的项目名称(可能不应包含scrapy一词)或标准浏览器的用户代理. USER_AGENT='my-cool-project (http://example.com)' 详细的错误分析 我们都想学习,所以这里有一个解释我如何得到这个结果,以及如果你再次看到这样的行为你可以做什么. 对于蜘蛛的所有请求,网站tiki.vn似乎返回HTTP status 404.您可以在屏幕截图中看到,您对/robots.txt和/ dien-thoai-may-tinh-bang / c1789的请求都获得了404. 404表示“未找到”,Web服务器使用它来显示URL不存在.但是,如果我们手动检查相同的站点,我们可以看到两个站点都包含有效内容.现在,从技术上讲,这些网站可能同时返回内容和404错误代码,但我们可以使用浏览器的开发者控制台(例如Chrome或Firefox)进行检查. 在这里,我们可以看到robots.txt返回有效的200状态代码. 需要进一步调查 许多网站试图限制抓取,因此他们尝试检测抓取行为.因此,他们会查看一些指标,并决定他们是否会向您提供内容或阻止您的请求.我认为这正是发生在你身上的事. 我想爬一个网站,它在家用电脑上工作得很好,但对我服务器的任何请求(scrapy,wget,curl,……)都没有回复(甚至不是404). 您需要采取的后续步骤来分析此问题的原因: >您可以从家用电脑访问该网站(并获得状态代码200)吗? 您可以使用wget获取它,如下所示: wget https://tiki.vn/dien-thoai-may-tinh-bang/c1789 wget会发送自定义用户代理,因此如果此命令不起作用(可以从我的PC执行),您可能希望将其设置为web browser’s user-agent. wget -U 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML,like Gecko) Chrome/61.0.3163.100 Safari/537.36' https://tiki.vn/dien-thoai-may-tinh-bang/c1789 这将帮助您确定问题是否与服务器有关(例如,他们阻止了IP或整个IP范围),或者您是否需要对您的蜘蛛进行一些修改. 检查用户代理 如果它适用于您的服务器的wget,我会怀疑scrapy的用户代理是问题. According to the documentation,scrapy确实使用Scrapy / VERSION(http://scrapy.org)作为用户代理,除非您自己设置.它们很可能会根据用户代理阻止您的蜘蛛. 因此,您必须转到scrapy项目中的settings.py并在那里查找USER_AGENT设置.现在,将其设置为不包含关键字scrapy的任何内容.如果您想要好,请使用项目名称域,否则使用标准浏览器用户代理. 不错的变种: USER_AGENT='my-cool-project (http://example.com)' 不太好(但在刮擦中很常见)变体: USER_AGENT='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML,like Gecko) Chrome/61.0.3163.100 Safari/537.36' 实际上,我能够通过本地PC上的wget命令验证它们是否阻止了用户代理: wget -U 'Scrapy/1.3.0 (+http://scrapy.org)' https://tiki.vn/dien-thoai-may-tinh-bang/c1789 结果 --2017-10-14 18:54:04-- https://tiki.vn/dien-thoai-may-tinh-bang/c1789 Loaded CA certificate '/etc/ssl/certs/ca-certificates.crt' Resolving tiki.vn... 203.162.81.188 Connecting to tiki.vn|203.162.81.188|:443... connected. HTTP request sent,awaiting response... 404 Not Found 2017-10-14 18:54:06 ERROR 404: Not Found. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |