Python Scrapy:HTTP状态代码未处理或不允许?

Python Scrapy:HTTP状态代码未处理或不允许?,python,scrapy,web-crawler,Python,Scrapy,Web Crawler,我想得到产品名称,链接,在类别的价格 但失败“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):

我想得到产品名称,链接,在类别的价格

但失败“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的用户代理,您被阻止

USER_AGENT='my-cool-project (http://example.com)'
您有两个选择:

  • 满足网站的愿望,不要刮伤网站,或
  • 更改您的用户代理
  • 我想你会选择第二种

    转到scrapy项目中的
    设置.py
    ,并将用户代理设置为非默认值。您自己的项目名称(可能不应包含单词
    scrapy
    )或标准浏览器的用户代理

    USER_AGENT='my-cool-project (http://example.com)'
    
    详细误差分析 我们都想学习,所以这里有一个解释,我是如何得到这个结果的,如果你再次看到这样的行为,你可以做什么

    网站tiki.vn似乎会返回您的爬行器的所有请求。您可以在屏幕截图中看到,您对
    /robots.txt
    /dien thoai may tinh bang/c1789
    的请求都得到了404

    404表示“未找到”,web服务器使用它来表示URL不存在。但是,如果我们手动检查相同的站点,我们可以看到这两个站点都包含有效的内容。现在,从技术上讲,这些网站可能同时返回内容和404错误代码,但我们可以通过浏览器(如Chrome或Firefox)的开发者控制台进行检查

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

    有待进一步调查 许多网站试图限制刮取,所以他们试图检测刮取行为。因此,他们将查看一些指标,并决定是否向您提供内容或阻止您的请求。我想这就是发生在你身上的事情

    我想抓取一个网站,它在我的家用电脑上运行完全正常,但对我的服务器(scrapy、wget、curl等)的任何请求都没有响应(甚至没有404)

    您必须采取以下步骤来分析此问题的原因:

    • 你能从家用电脑上访问网站吗(你的状态代码是200)
    • 如果从家用电脑上运行scrapy,会发生什么情况?还是404
    • 尝试从运行scrapy的服务器加载网站(例如,使用wget或curl)
    您可以使用wget获取它,如下所示:

    wget https://tiki.vn/dien-thoai-may-tinh-bang/c1789
    
    wget确实会发送一个自定义用户代理,因此如果此命令不起作用,您可能希望将其设置为a(它在我的PC上起作用)

    这将帮助您查明问题是否出在服务器上(例如,他们阻止了IP或整个IP范围),或者您是否需要对spider进行一些修改

    正在检查用户代理 如果你的服务器能与wget一起工作,我怀疑是scrapy的用户代理出了问题,scrapy确实使用
    scrapy/版本(+http://scrapy.org)
    作为用户代理,除非您自己设置。很可能他们会基于用户代理阻止您的爬行器

    USER_AGENT='my-cool-project (http://example.com)'
    
    因此,您必须转到scrapy项目中的
    settings.py
    ,并在那里查找设置
    USER\u AGENT
    。现在,将其设置为不包含关键字
    scrapy
    的任何内容。如果你想表现友好,可以使用你的项目名+域,否则使用标准的浏览器用户代理

    USER_AGENT='my-cool-project (http://example.com)'
    
    漂亮的变体:

    USER_AGENT='my-cool-project (http://example.com)'
    
    不太好(但在刮削中很常见)的变体:

    事实上,我可以通过本地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.
    
    除了用户代理更改外,还请参考http错误代码。在您的例子中,http错误代码是404,这表示客户端错误()


    如果网站需要经过身份验证的会话来抓取内容,那么http错误代码可能是401,这表示客户端错误()

    除了其他两个好的答案外,请尝试以下操作:

  • 'Redirect\u enabled':
    的值设置为
    true
  • 使用
    https
    http
    协议
  • 使用或删除www前缀

  • 尝试使用以下命令更改用户代理:

    scrapy shell -s USER_AGENT='custom user agent' 'http://www.example.com'
    
    有时,网站会阻止特定的用户代理,以防止爬行和发送过多的请求。然后您可以使用
    view(response)
    命令查看它是否工作


    对于基于类的实现讲的故事非常完整

    我试图从另一个网站抓取数据,但遇到了同样的问题。更改用户代理对我来说效果很好。非常感谢你!您好@Gait,如果它解决了您的问题,请接受答案。否则,请让我们知道社区如何进一步支持您!在哪里设置
    “重定向\u启用”
    :到
    true