如何不依赖Requests与BeautifulSoup实现Scrapy跨链接爬取邮箱?
解决方法:用Scrapy异步请求+
cb_kwargs传递数据 你的问题在于同步调用自定义方法爬取详情页不符合Scrapy的异步工作机制,而且get_email方法里的response根本没有被正确获取(这个方法既没发起请求,也没接收响应对象)。结合你「不能用meta参数」的要求,我们可以用Scrapy的cb_kwargs传递搜索结果页的名称和电话数据,同时用异步请求爬取详情页提取邮箱。
修改后的完整代码如下:
import scrapy from scrapy.crawler import CrawlerProcess class YellowpagesSpider(scrapy.Spider): name = "yellowpages" start_urls = ["https://www.yellowpages.com/search?search_terms=Coffee+Shops&geo_location_terms=San+Francisco%2C+CA"] def parse(self, response): for items in response.css("div.v-card .info"): name = items.css("a.business-name > span::text").get() phone = items.css("div.phones::text").get() email_link = response.urljoin(items.css("a.business-name::attr(href)").get()) # 用cb_kwargs传递name和phone,发起异步请求到详情页 yield scrapy.Request( url=email_link, callback=self.parse_email, cb_kwargs={"name": name, "phone": phone} ) def parse_email(self, response, name, phone): # 从详情页提取邮箱 email = response.css("a.email-business[href^='mailto:']::attr(href)").get() # 把所有数据一起输出 yield {"Name": name, "Phone": phone, "Email": email} if __name__ == "__main__": c = CrawlerProcess({ 'USER_AGENT': 'Mozilla/5.0', }) c.crawl(YellowpagesSpider) c.start()
关键修改点说明:
替换同步请求为Scrapy异步Request:
原来用requests.get同步请求详情页会阻塞爬虫,导致速度慢。现在用scrapy.Request把请求交给Scrapy引擎调度,利用Scrapy的并发特性大幅提升爬取速度。用
cb_kwargs传递数据:
你要求不能用meta参数,cb_kwargs是Scrapy提供的更直观的参数传递方式,直接把搜索结果页的name和phone传递给详情页的回调函数parse_email,完全符合你的要求。拆分逻辑到回调函数:
把详情页的邮箱提取逻辑放在专门的parse_email回调里,符合Scrapy的「请求-回调」工作模式,代码结构更清晰易维护。
这样修改后,既实现了纯Scrapy的爬取逻辑,又满足了你不能用meta的要求,同时爬取速度会比原来用Requests的版本快很多。
内容的提问来源于stack exchange,提问作者robots.txt
相关产品推荐
相关产品推荐

