You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何不依赖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()

关键修改点说明:

  1. 替换同步请求为Scrapy异步Request:
    原来用requests.get同步请求详情页会阻塞爬虫,导致速度慢。现在用scrapy.Request把请求交给Scrapy引擎调度,利用Scrapy的并发特性大幅提升爬取速度。

  2. 用cb_kwargs传递数据:
    你要求不能用meta参数,cb_kwargs是Scrapy提供的更直观的参数传递方式,直接把搜索结果页的name和phone传递给详情页的回调函数parse_email,完全符合你的要求。

  3. 拆分逻辑到回调函数:
    把详情页的邮箱提取逻辑放在专门的parse_email回调里,符合Scrapy的「请求-回调」工作模式,代码结构更清晰易维护。

这样修改后,既实现了纯Scrapy的爬取逻辑,又满足了你不能用meta的要求,同时爬取速度会比原来用Requests的版本快很多。

内容的提问来源于stack exchange,提问作者robots.txt

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 04:23:14