加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

python – 使用Scrapy进行爬网 – 不处理或不允许HTTP状态代码?

发布时间:2020-12-20 12:34:46 所属栏目:Python 来源:网络整理
导读:我想获得类别 https://tiki.vn/dien-thoai-may-tinh-bang/c1789的产品标题,链接,价格 但它失败了“HTTP状态代码未被处理或不被允许” https://i.stack.imgur.com/KCFw2.jpg 我的文件:spiders / tiki.py import scrapyfrom scrapy.linkextractors import Lin
我想获得类别 https://tiki.vn/dien-thoai-may-tinh-bang/c1789的产品标题,链接,价格

但它失败了“HTTP状态代码未被处理或不被允许”
https://i.stack.imgur.com/KCFw2.jpg

我的文件: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)进行检查.

enter image description here

在这里,我们可以看到robots.txt返回有效的200状态代码.

需要进一步调查

许多网站试图限制抓取,因此他们尝试检测抓取行为.因此,他们会查看一些指标,并决定他们是否会向您提供内容或阻止您的请求.我认为这正是发生在你身上的事.

我想爬一个网站,它在家用电脑上工作得很好,但对我服务器的任何请求(scrapy,wget,curl,……)都没有回复(甚至不是404).

您需要采取的后续步骤来分析此问题的原因:

>您可以从家用电脑访问该网站(并获得状态代码200)吗?
>如果你从家用电脑上运行scrapy,会发生什么? 404还是404?
>尝试从运行scrapy的服务器加载网站(例如使用wget或curl)

您可以使用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.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读