web-dev-qa-db-fra.com

Exploration avec Scrapy - Le code d'état HTTP n'est pas géré ou n'est pas autorisé?

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!

7
gait

tl; dr

Vous êtes bloqué sur la base de l'agent utilisateur de scrapy.

Vous avez deux options:

  1. Accordez le souhait du site et ne les grattez pas, ou
  2. Changer votre user-agent

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)'

Analyse détaillée des erreurs

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) .

enter image description here

Ici, nous pouvons voir que robots.txt renvoie un code d'état 200 valide.

Enquêtes supplémentaires à effectuer

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:

  • Pouvez-vous accéder au site Web à partir de votre ordinateur personnel (et obtenez-vous le code d'état 200)?
  • Que se passe-t-il si vous exécutez la tremblante depuis votre ordinateur personnel? Toujours 404?
  • Essayez de charger le site Web à partir du serveur, sur lequel vous exécutez scrapy (par exemple avec wget ou curl)

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.

Vérification de l'agent utilisateur

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.
22
Aufziehvogel

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É )

0
deshan