Невозможно использовать `headers` или `dont_filter = True` при выполнении встроенных запросов в асинхронном методе в scrapy

#python #python-3.x #web-scraping #scrapy

#питон #python-3.x #соскабливание полотна #шершавый

Вопрос:

Я создал скрипт, чтобы очистить name , phone и email адреса разных магазинов от yellowpages.com . Я использовал async метод в scrapy для анализа адреса электронной почты с внутренних страниц при анализе имени и телефона с целевой страницы. Сценарий работает нормально.

Чего я не могу понять, так это как я могу использовать headers или dont_filter=True внутри встроенных запросов. На самом деле я имел в виду следующее.

 request = response.follow(email_url)
resp = await self.crawler.engine.download(request, self)
 

паук, которого я использую:

 import scrapy
from scrapy.crawler import CrawlerProcess

class YellowpagesSpider(scrapy.Spider):
    name = "yellowpages"
    start_urls = ["https://www.yellowpages.com/search?search_terms=Coffee Shopsamp;geo_location_terms=San Francisco, CA"]

    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36',
    }

    def start_requests(self):
        for start_url in self.start_urls:
            yield scrapy.Request(start_url,headers=self.headers)

    async def parse(self, response):
        for items in response.css("[class='result'] .v-card > .info"):
            name = items.css("a.business-name > span::text").get()
            phone = items.css("div.phones::text").get()
            email_url = items.css("a.business-name::attr(href)").get()

            request = response.follow(email_url)
            resp = await self.crawler.engine.download(request, self)
            email = resp.css("a.email-business[href^='mailto:']::attr(href)").get()
            yield {"Shop name": name, "Phone": phone, "Email": email}
            
if __name__ == "__main__":
    c = CrawlerProcess()
    c.crawl(YellowpagesSpider)
    c.start()
 

Ответ №1:

Вы можете передать это само по follow себе. follow методы принимают все параметры, которые __init__ поддерживает a

 response.follow(email_url, dont_filter=True, headers=self.headers)
 

https://docs.scrapy.org/en/latest/topics/request-response.html#scrapy.http.Response.Подписаться