Scrapy登录后追踪链接异常:HtmlResponse返回空值问题排查
问题分析与修正方案
嘿,我看到你代码里的问题啦,主要是请求逻辑和语法上的错误,导致拿不到追踪页面的内容,下面一步步给你梳理修正:
1. 核心错误:没有发起真实的页面请求
你写的board = scrapy.http.(track_board)是完全错误的语法,就算修正成scrapy.http.HtmlResponse,也只是手动创建了一个空的本地响应对象,根本没有去服务器请求目标页面的真实内容——这就是你拿到空结果的根本原因。
Scrapy的工作逻辑是通过yield一个Request对象来触发新的爬取请求,再在回调函数里处理服务器返回的响应内容,而不是直接构造Response。
2. 次要问题:XPath路径的小坑
你原来的XPath写法response.xpath('//div[@id="mainmenu"]').xpath('//a[contains(@href, "tracking")]/@href')里,第二个//会从整个HTML文档的根节点重新查找,而不是在你选中的div#mainmenu节点下做相对查找,容易匹配到页面其他无关的链接。应该改成.//来限定查找范围。
另外你的formdata里的键多了个冒号FormUserLogin[login]:,这也可能导致登录表单提交失败,得去掉。
修正后的完整代码
import scrapy class AMTSpider(scrapy.Spider): name = "amt_spider" start_urls = ['http://amtbox.us/index.php/access/user/login'] def parse(self, response): yield scrapy.FormRequest.from_response( response, formdata={'FormUserLogin[login]': 'my_name', 'FormUserLogin[password]': 'my_pass'}, callback=self.after_login ) def after_login(self, response): # 先验证是否登录成功(可选但推荐) if "登录失败" in response.text: # 替换成页面实际的失败提示文本 self.logger.error("登录失败!请检查账号密码或表单字段") return main_url = 'http://amtbox.us' # 用相对路径XPath提取追踪页面链接 track_href = response.xpath('//div[@id="mainmenu"]//a[contains(@href, "tracking")]/@href').extract_first() if track_href: track_board_url = main_url + track_href # yield Request发起真实请求,指定回调函数处理页面内容 yield scrapy.Request( url=track_board_url, callback=self.parse_track_board ) else: self.logger.warning("未找到追踪页面的链接") def parse_track_board(self, response): # 在这里处理追踪页面的内容 table = response.css('div.main') print('RESULT', table) # 可以继续提取具体数据,比如: # for row in table.xpath('.//tr'): # yield { # 'column1': row.xpath('.//td[1]/text()').get(), # 'column2': row.xpath('.//td[2]/text()').get() # }
额外提示
- 登录后建议先做验证:比如检查页面是否出现用户名、欢迎语这类登录成功的标识,或者有没有登录失败的提示,能及时排查账号密码或表单字段的问题。
- 处理
extract_first()返回None的情况,避免拼接URL时出现报错。
内容的提问来源于stack exchange,提问作者Nurbek Batyrzhan uulu
相关产品推荐
相关产品推荐

