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

Scrapy爬虫爬取律师网站邮箱返回错误结果问题求助

问题定位
  • 详情页请求类型错误:原代码列表页使用SeleniumRequest加载动态渲染内容,但跳转律师详情页时用了普通ScrapyRequest。目标站点详情页的联系信息是前端JS动态渲染生成的,普通请求拿到的初始HTML源码中不存在邮箱相关节点,自然提取不到内容。
  • XPath语法错误:提取a标签属性时写了//@//@href,多写了一层无效的@标识,属于语法错误,无法匹配到任何有效属性值。
  • 逻辑冗余:页面中class="lawyer-info"的节点全局唯一,不需要做循环遍历;用正则判断@符号的逻辑可以直接整合到XPath匹配规则中,减少不必要的运算。
  • 缺少结果清洗:邮箱存放在mailto:协议开头的a标签href属性中,直接提取会携带mailto:前缀,需要做字符串切割才能拿到纯邮箱地址。
修复后可运行代码
import scrapy
import re
from scrapy_selenium import SeleniumRequest


class TestSpider(scrapy.Spider):
    name = 'test'
    page_number = 1

    def start_requests(self):
        yield SeleniumRequest(
            url="https://zoekeenadvocaat.advocatenorde.nl/zoeken?q=&type=advocaten&limiet=10&sortering=afstand&filters%5Brechtsgebieden%5D=%5B%5D&filters%5Bspecialisatie%5D=0&filters%5Btoevoegingen%5D=0&locatie%5Badres%5D=Holland&locatie%5Bgeo%5D%5Blat%5D=52.132633&locatie%5Bgeo%5D%5Blng%5D=5.291266&locatie%5Bstraal%5D=56&locatie%5Bhash%5D=67eb2b8d0aab60ec69666532ff9527c9&weergave=lijst&pagina=1",
            wait_time=3,
            callback=self.parse,
            dont_filter=True
        )

    def parse(self, response):
        lawyer_links = response.xpath("//span[@class='h4 no-margin-bottom']//a/@href").extract()
        for link in lawyer_links:
            detail_url = response.urljoin(link)
            # 详情页同样用SeleniumRequest等待动态内容加载完成
            yield SeleniumRequest(
                url=detail_url,
                wait_time=2,
                callback=self.parse_detail
            )

    def parse_detail(self, response):
        # 提取基础信息,加空值兜底避免节点不存在时报错
        lawyer_name = response.css(".title h3::text").get("").strip()
        org_name = response.css(".secondary::text").get("").strip()
        # 直接匹配带mailto协议的邮箱链接,修正XPath语法错误
        email_raw = response.xpath("//section[@class='lawyer-info']//div[@class='column small-9']//a[starts-with(@href, 'mailto:')]/@href").get()
        email = ""
        if email_raw:
            # 去掉mailto前缀拿到纯邮箱地址
            email = email_raw.replace("mailto:", "").strip()
        
        yield {
            "lawyer_name": lawyer_name,
            "organization": org_name,
            "email": email
        }
运行说明
  • 修复后代码统一用SeleniumRequest请求列表和详情页,确保动态内容加载完成后再提取数据
  • 代码删除了原脚本中未使用的冗余导入,减少不必要的资源占用
  • 所有字段提取加了空值兜底,避免对应节点不存在时脚本抛出异常中断
  • 运行前请确保已经正确安装scrapy-selenium依赖并完成对应浏览器驱动配置
  • 爬取过程请遵守目标站点的访问规则,合理控制请求频率

内容的提问来源于stack exchange,提问作者Amen Aziz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 23:09:16