如何用Scrapy.FormRequest实现无name属性输入框的产品搜索爬取?
解决Scrapy爬取MoparPartsGiant产品编号搜索问题
核心思路:抓包分析实际请求参数
前端输入框没有name属性没关系,直接通过浏览器抓包获取搜索时实际发送给服务器的请求细节(请求方法、URL、参数名),再构造对应的Scrapy请求即可,这种方式比依赖FormRequest.from_response更稳定可靠。
步骤1:抓包获取请求信息
- 打开浏览器开发者工具(按F12),切换到「网络」面板
- 在网站搜索框输入任意产品编号(比如
5175788AA)并提交搜索 - 在网络请求列表中找到搜索对应的请求(通常是POST或GET方法,URL包含
search关键字) - 查看该请求的「参数」或「表单数据」,记录下服务器接收的参数名(比如可能是
query、term或search_text),以及请求的URL和方法
步骤2:构造Scrapy请求(无需依赖FormRequest.from_response)
根据抓包到的信息,直接构造scrapy.Request或scrapy.FormRequest:
示例1:如果是POST请求
def parse(self, response): product_numbers = ['5175788AA', '82214506AB', 'UN051D1AA'] # 替换为抓包到的实际搜索接口URL和参数名 search_url = 'https://www.moparpartsgiant.com/search-handler' param_key = 'search_term' for number in product_numbers: yield scrapy.FormRequest( url=search_url, formdata={param_key: number}, callback=self.parse_product )
示例2:如果是GET请求
def parse(self, response): product_numbers = ['5175788AA', '82214506AB', 'UN051D1AA'] # 替换为抓包到的实际搜索URL格式 search_url_template = 'https://www.moparpartsgiant.com/search?q={}' for number in product_numbers: yield scrapy.Request( url=search_url_template.format(number), callback=self.parse_product )
备选方案:用FormRequest.from_response定位无name的输入框
如果一定要用FormRequest.from_response,可以通过XPath/CSS选择器指定表单和输入框,手动填充值:
def parse(self, response): product_number = '5175788AA' # 替换为实际搜索表单的XPath(比如通过action属性或ID定位) form_xpath = '//form[@action="/search"]' # 替换为实际输入框的XPath(比如通过placeholder或类型定位) input_element = response.xpath(f'{form_xpath}//input[@type="text"]').get() yield scrapy.FormRequest.from_response( response, formxpath=form_xpath, # 手动构造表单数据,通过XPath匹配输入框 formdata={input_element.attrib.get('id') or '': product_number}, callback=self.parse_product )
注意事项
- 抓包时要注意是否有隐藏参数(比如csrf token),如果有需要从页面中提取并加入请求参数
- 避免请求频率过高,可设置
DOWNLOAD_DELAY防止被网站封禁
内容的提问来源于stack exchange,提问作者Dmytro
相关产品推荐
相关产品推荐

