Je veux obtenir le titre du produit, le lien, le prix dans la catégorie https://tiki.vn/dien-thoai-may-tinh-bang/c1789
Mais il échoue "Le code d'état HTTP n'est pas géré ou n'est pas autorisé" https://i.stack.imgur.com/KCFw2.jpg
Mon fichier: 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
Fichier: items.py
import scrapy
class StackdataItem(scrapy.Item):
title = scrapy.Field()
url = scrapy.Field()
price = scrapy.Field()
Aidez-moi, s'il vous plaît!!!! Merci!
Vous êtes bloqué sur la base de l'agent utilisateur de scrapy.
Vous avez deux options:
Je suppose que vous souhaitez prendre l'option 2.
Accédez à votre settings.py
Dans votre projet fragmentaire et définissez votre agent utilisateur sur une valeur non par défaut. Soit votre propre nom de projet (il ne devrait probablement pas contenir le mot scrapy
) ou l'agent utilisateur d'un navigateur standard.
USER_AGENT='my-cool-project (http://example.com)'
Nous voulons tous apprendre, alors voici une explication de la façon dont je suis arrivé à ce résultat et ce que vous pouvez faire si vous voyez à nouveau un tel comportement.
Le site Web tiki.vn semble renvoyer état HTTP 404 pour toutes les demandes de votre araignée. Vous pouvez voir dans votre capture d'écran que vous obtenez un 404 pour vos demandes à /robots.txt
Et /dien-thoai-may-tinh-bang/c1789
.
404 signifie "introuvable" et les serveurs Web l'utilisent pour montrer qu'il n'existe pas d'URL. Cependant, si nous vérifions les mêmes sites manuellement, nous pouvons voir que les deux sites contiennent un contenu valide. Maintenant, il pourrait être techniquement possible que ces sites renvoient à la fois du contenu et un code d'erreur 404, mais nous pouvons le vérifier avec la console développeur de notre navigateur (par exemple Chrome ou Firefox) .
Ici, nous pouvons voir que robots.txt renvoie un code d'état 200 valide.
De nombreux sites Web tentent de restreindre le grattage, ils essaient donc de détecter les comportements de grattage. Ainsi, ils examineront certains indicateurs et décideront s'ils vous serviront du contenu ou bloqueront votre demande. Je suppose que c'est exactement ce qui vous arrive.
Je voulais explorer un site Web, qui fonctionnait très bien depuis mon ordinateur personnel, mais je n'ai pas répondu du tout (même pas 404) à aucune demande de mon serveur (scrapy, wget, curl, ...).
Les prochaines étapes que vous devrez suivre pour analyser la raison de ce problème:
Vous pouvez le récupérer avec wget comme ceci:
wget https://tiki.vn/dien-thoai-may-tinh-bang/c1789
wget n'envoie pas d'agent utilisateur personnalisé, vous voudrez donc peut-être le définir sur agent utilisateur du navigateur Web si cette commande ne fonctionne pas (elle le fait depuis mon PC).
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
Cela vous aidera à savoir si le problème est lié au serveur (par exemple, ils ont bloqué l'IP ou une plage IP entière) ou si vous devez apporter des modifications à votre araignée.
Si cela fonctionne avec wget pour votre serveur, je soupçonne que le user-agent de scrapy est le problème. Selon la documentation , scrapy utilise Scrapy/VERSION (+http://scrapy.org)
comme agent utilisateur à moins que vous ne le définissiez vous-même. Il est tout à fait possible qu'ils bloquent votre araignée en fonction de l'agent utilisateur.
Donc, vous devez vous rendre dans settings.py
Dans votre projet scrapy et y rechercher les paramètres USER_AGENT
. Maintenant, définissez ceci sur tout ce qui ne contient pas le mot clé scrapy
. Si vous voulez être gentil, utilisez votre nom de projet + domaine, sinon utilisez un agent utilisateur de navigateur standard.
Belle variante:
USER_AGENT='my-cool-project (http://example.com)'
Variante pas si agréable (mais courante en grattage):
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'
En fait, j'ai pu vérifier qu'ils bloquent sur l'agent utilisateur avec cette commande wget depuis mon PC local:
wget -U 'Scrapy/1.3.0 (+http://scrapy.org)' https://tiki.vn/dien-thoai-may-tinh-bang/c1789
ce qui se traduit par
--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.
Mis à part le changement de l'agent utilisateur Aufziehvogel , veuillez également vous référer au code d'erreur http. Dans votre cas, le code d'erreur http est 404, ce qui indique une ERREUR CLIENT ( NOT FOUND ).
Si le site Web nécessite une session authentifiée pour supprimer le contenu, le code d'erreur http peut être 401, ce qui indique une ERREUR CLIENT ( NON AUTORISÉ )