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
相关产品推荐
相关产品推荐

