web-dev-qa-db-fra.com

Comment envoyer un cookie avec des requêtes CrawlSpider scrapy?

J'essaie de créer ce scrapper Reddit en utilisant le framework Scrapy de Python. 

J'ai utilisé le CrawSpider pour explorer Reddit et ses sous-titres. Mais lorsque je rencontre des pages avec un contenu réservé aux adultes, le site demande un cookie over18=1.

Donc, j'ai essayé d'envoyer un cookie avec chaque demande de l'araignée, mais ça ne marche pas.

Voici mon code araignée. Comme vous pouvez le constater, j'ai essayé d'ajouter un cookie à chaque requête d'araignée à l'aide de la méthode start_requests().

Quelqu'un ici pourrait-il me dire comment faire cela? Ou ce que j'ai fait de mal?

from scrapy import Spider
from scrapy.spiders import CrawlSpider, Rule
from scrapy.linkextractors import LinkExtractor
from reddit.items import RedditItem
from scrapy.http import Request, FormRequest

class MySpider(CrawlSpider):
    name = 'redditscraper'
    allowed_domains = ['reddit.com', 'imgur.com']
    start_urls = ['https://www.reddit.com/r/nsfw']

    rules = (
        Rule(LinkExtractor(
            allow=['/r/nsfw/\?count=\d*&after=\w*']),
            callback='parse_item',
            follow=True),
    )

    def start_requests(self):
        for i,url in enumerate(self.start_urls):
            print(url)
            yield Request(url,cookies={'over18':'1'},callback=self.parse_item)

    def parse_item(self, response):
        titleList = response.css('a.title')

        for title in titleList:
            item = RedditItem()
            item['url'] = title.xpath('@href').extract()
            item['title'] = title.xpath('text()').extract()
            yield item
14
Parthapratim Neog

D'accord. Essayez de faire quelque chose comme ça.

def start_requests(self):
    headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.85 Safari/537.36'}
    for i,url in enumerate(self.start_urls):
        yield Request(url,cookies={'over18':'1'}, callback=self.parse_item, headers=headers)

C'est l'agent utilisateur qui vous bloque.

Modifier:

Je ne sais pas ce qui ne va pas avec CrawlSpider mais Spider pourrait quand même fonctionner.

#!/usr/bin/env python
# encoding: utf-8
import scrapy


class MySpider(scrapy.Spider):
    name = 'redditscraper'
    allowed_domains = ['reddit.com', 'imgur.com']
    start_urls = ['https://www.reddit.com/r/nsfw']

    def request(self, url, callback):
        """
         wrapper for scrapy.request
        """
        request = scrapy.Request(url=url, callback=callback)
        request.cookies['over18'] = 1
        request.headers['User-Agent'] = (
            'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, '
            'like Gecko) Chrome/45.0.2454.85 Safari/537.36')
        return request

    def start_requests(self):
        for i, url in enumerate(self.start_urls):
            yield self.request(url, self.parse_item)

    def parse_item(self, response):
        titleList = response.css('a.title')

        for title in titleList:
            item = {}
            item['url'] = title.xpath('@href').extract()
            item['title'] = title.xpath('text()').extract()
            yield item
        url = response.xpath('//a[@rel="nofollow next"]/@href').extract_first()
        if url:
            yield self.request(url, self.parse_item)
        # you may consider scrapy.pipelines.images.ImagesPipeline :D
14
esfy

Les Scrapy Docs

1.En utilisant un dict:

request_with_cookies = Request(url="http://www.example.com",
                               cookies={'currency': 'USD', 'country': 'UY'})

2.Utiliser une liste de dict:

request_with_cookies = Request(url="http://www.example.com",
                               cookies=[{'name': 'currency',
                                        'value': 'USD',
                                        'domain': 'example.com',
                                        'path': '/currency'}])
3
CTD

Vous pouvez également l'envoyer via l'en-tête.

scrapy.Request(url=url, callback=callback, headers={'Cookie':my_cookie})
3
Aminah Nuraini

Vous pouvez utiliser le paramètre process_request dans la règle, par exemple:

    rules = (
    Rule(LinkExtractor(
        allow=['/r/nsfw/\?count=\d*&after=\w*']),
        callback='parse_item',
        process_request='ammend_req_header',
        follow=True)

    def ammend_req_header(self, request):
        request.cookies['over18']=1
        return request
0
tomstell