#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()