scrapy.http.request не выполняет обратный вызов из Scrapy

#python #scrapy #request

#python #scrapy #запрос

Вопрос:

Я хочу отправить http-запрос на сайт, такой как Twitter, например, и получить title тег из scrapy runspider и запустить его через программу:

 class firstSpider(scrapy.Spider): 
   name = "first" 
   start_urls=['http://twitter.com/begin_password_reset']     
   def get_token(self):
       print('aa')
       try:
           url = "https://www.twitter.com/"
           # Set the headers here. 
           headers =  {
                'Accept': '*/*',
                'Accept-Encoding': 'gzip, deflate, br',
                'Accept-Language': 'en-GB,en-US;q=0.9,en;q=0.8',
                'Referer': 'https://www.twitter.com',
                'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36',
           }
           # Send the request
           scrapy.http.Request(url,callback=self.parse_twitter, method='GET' , headers=headers,  dont_filter=False)
       except ValueError:
           print("Oops!  That was no valid number.  Try again...")

   def parse_twitter(self,response):
       try:
           filename = 'aaa.txt'
           print('bb')
           with open(filename, 'wb') as f: 
               f.write(Selector(response=response).xpath('//title/text()').get().encode())
       except ValueError:
           print("Oops!  That was no valid number.  Try again...")
      
f= firstSpider()
f.get_token()
  

Первая функция get_token работает, но обратный вызов twitter_parse не работает.

Я также использовал yield и return , но второй метод не выполняется и ничего не возвращает.

Комментарии:

1. вы должны использовать yield таким образом; yield scrapy.http. Запрос(….

2. запустите свой spider с помощью scrapy crawl first в консоли и поместите get_token вызов в parse_twitter метод.

Ответ №1:

Вы должны реализовать parse метод в вашем spider, вызвать get_token и запустить его через CrawlerProcess :

Проблема с вашим селектором, но вы можете увидеть инструкции печати в этом примере:

 import scrapy
from scrapy import Request, Selector
from scrapy.crawler import CrawlerProcess


class firstSpider(scrapy.Spider):
    name = "first"
    start_urls = ['https://twitter.com/begin_password_reset']

    def parse(self, response):
        return self.get_token()

    def get_token(self):
        print('aa')
        try:
            url = "https://www.twitter.com/"
            # Set the headers here.
            headers = {
                'Accept': '*/*',
                'Accept-Encoding': 'gzip, deflate, br',
                'Accept-Language': 'en-GB,en-US;q=0.9,en;q=0.8',
                'Referer': 'https://www.twitter.com',
                'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36',
            }
            # Send the request
            yield Request(url, callback=self.parse_twitter, method='GET', headers=headers, dont_filter=False)
        except ValueError:
            print("Oops!  That was no valid number.  Try again...")

    def parse_twitter(self, response):
        try:
            filename = 'aaa.txt'
            print('bb')
            with open(filename, 'wb') as f:
                f.write(Selector(response=response).xpath('//title/text()').get().encode())
        except ValueError:
            print("Oops!  That was no valid number.  Try again...")


if __name__ == "__main__":
    c = CrawlerProcess({
        'USER_AGENT': 'Mozilla/5.0 (Windows NT 6.1; ) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36',
    })
    c.crawl(firstSpider)
    c.start()