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

2024-05-20 09:38:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我想得到产品名称,链接,价格分类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()

请帮帮我!!!!谢谢!


Tags: fromhttpsimportselfurlparseresponseextract
2条回答

tl;博士

你正在被scrapy的用户代理阻止。

你有两个选择:

  1. 满足网站的愿望,不要勉强实现,或者
  2. 更改用户代理

我想你想选择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状态码。

有待进一步调查

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

我想抓取一个网站,它在我的家用电脑上运行得很好,但根本没有响应(甚至没有404)来自我的服务器的任何请求(scrapy,wget,curl,…)。

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

  • 你能从你的家用电脑上访问这个网站吗(你的状态码是200吗)?
  • 如果你从家用电脑上运行scrapy会发生什么?还是404?
  • 尝试从运行scrapy的服务器加载网站(例如使用wget或curl)

你可以这样用wget来取它:

wget https://tiki.vn/dien-thoai-may-tinh-bang/c1789

wget确实发送了一个自定义用户代理,因此如果此命令不起作用(它在我的电脑上起作用),您可能希望将其设置为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范围),或者您是否需要对spider进行一些修改。

检查用户代理

如果它与wget一起用于您的服务器,我会怀疑scrapy的用户代理是问题所在。According to the documentation,scrapy使用Scrapy/VERSION (+http://scrapy.org)作为用户代理,除非您自己设置。很有可能他们基于用户代理来阻止你的蜘蛛。

所以,您必须在废弃的项目中找到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.

除了Aufziehvogel用户代理更改外,还请参考http错误代码。在您的情况下,http错误代码是404,这表示客户端错误(NOT FOUND)。

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

相关问题 更多 >