我想得到产品名称,链接,价格分类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
)或标准浏览器的用户代理。详细误差分析
我们都想学习,所以这里有一个解释,我是如何得到这个结果的,如果你再看到这样的行为,你能做什么。
网站tiki.vn似乎为您的蜘蛛的所有请求返回HTTP status 404。您可以在屏幕截图中看到,对
/robots.txt
和/dien-thoai-may-tinh-bang/c1789
的请求都会得到404。404表示“找不到”,web服务器使用它来显示URL不存在。但是,如果我们手动检查相同的站点,我们可以看到两个站点都包含有效的内容。现在,从技术上讲,这些网站可能同时返回内容和404错误代码,但我们可以通过浏览器的开发人员控制台(如Chrome或Firefox)来检查。
这里我们可以看到robots.txt返回一个有效的200状态码。
有待进一步调查
许多网站试图限制刮取,因此它们试图检测刮取行为。因此,他们会查看一些指标,并决定是否向您提供内容或阻止您的请求。我想这正是发生在你身上的事。
我想抓取一个网站,它在我的家用电脑上运行得很好,但根本没有响应(甚至没有404)来自我的服务器的任何请求(scrapy,wget,curl,…)。
接下来,您必须采取以下步骤来分析此问题的原因:
你可以这样用wget来取它:
wget确实发送了一个自定义用户代理,因此如果此命令不起作用(它在我的电脑上起作用),您可能希望将其设置为web browser's user-agent。
这将帮助您找出问题是否与服务器有关(例如,他们阻止了IP或整个IP范围),或者您是否需要对spider进行一些修改。
检查用户代理
如果它与wget一起用于您的服务器,我会怀疑scrapy的用户代理是问题所在。According to the documentation,scrapy使用
Scrapy/VERSION (+http://scrapy.org)
作为用户代理,除非您自己设置。很有可能他们基于用户代理来阻止你的蜘蛛。所以,您必须在废弃的项目中找到
settings.py
,并在那里查找设置USER_AGENT
。现在,将其设置为不包含关键字scrapy
的任何内容。如果你想表现的好,使用你的项目名称+域名,否则使用标准浏览器用户代理。不错的变体:
不是很好(但在刮擦中很常见)的变体:
事实上,我可以通过本地PC上的wget命令验证它们是否阻止了用户代理:
结果是
除了Aufziehvogel用户代理更改外,还请参考http错误代码。在您的情况下,http错误代码是404,这表示客户端错误(NOT FOUND)。
如果网站需要经过身份验证的会话来擦除内容,那么http错误代码可能是401,表示客户端错误(UNAUTHORIZED)
相关问题 更多 >
编程相关推荐