scrapy的一些容易忽视的点(模拟登陆,传递item等)

本文介绍了使用Scrapy爬虫时常见的八个问题及解决方案,包括item数据处理、页面解析策略、模拟登录方法等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

scrapy爬虫注意事项

一、item数据只有最后一条

这种情况一般存在于对标签进行遍历时,将item对象放置在了for循环的外部。解决方式:将item放置在for循环里面。


 

二、item字段传递后错误,混乱

有时候会遇到这样的情况,item传递几次之后,发现不同页面的数据被混乱的组合在了一起。这种情况一般存在于item的传递过程中,没有使用深拷贝。解决方式:使用深拷贝来传递item。


 

三、对一个页面要进行两种或多种不同的解析

这种情况一般出现在对同一页面有不同的解析要求时,但默认情况下只能得到第一个parse的结果。产生这个结果的原因是scrapy默认对拥有相同的url,相同的body以及相同的请求方法视为一个请求。解决方式:设置参数dont_filter='True'。


 

四、xpath中contains的使用

这种情况一般出现在标签没有特定属性值但是文本中包含特定汉字的情况,当然也可以用来包含特定的属性值来使用(只不过有特定属性值的时候我也不会用contains了)。

作者:村上春树

书名:挪威的森林

以上面这两个标签为例(自行F12查看),两个span标签没有特定的属性值,但里面一个包含作者,一个包含书名,就可以考虑使用contains来进行提取。


 

五、提取不在标签中的文本

有时候会遇到这样的情况,文本在两个标签之间,但不属于这两个标签的任何一个。此时可以考虑使用xpath的contains和following共同协助完成任务。

示例:

作者:

"村上春树"

书名

"挪威的森林"


 

六、使用css、xpath提取倒数第n个标签

对于很多页面,标签的数量有时候无法保证是一致的。如果用正向的下标进行提取,很可能出现数组越界的情况。这种时候可以考虑反向提取,必要时加一些判断。


 

七、提取表格信息

其实对于信息抓取,很多时候我们需要对表格页面进行抓取。一般的方方正正的表格提取相对简单,这里不讨论。只说下含有合并单元格的情况。

这个网页的表格为例,定义5个字段批次,招生代码,专业,招生数量以及费用,注意到合并单元格的标签里有个rowspan属性,可以用来辨识出有几行被合并。我的思路是有多少行数据,就将batch批次扩展到多少个,形成一个新的列表,然后进行遍历提取数据


 

八、模拟登陆

当页面数据需要登陆进行抓取时,就需要模拟登陆了。常见的方式有:使用登陆后的cookie来抓取数据;发送表单数据进行登陆;使用自动化测试工具登陆,比如selenium配合chrome、firefox等,不过听说selenium不再更新,也可以使用chrome的无头模式。鉴于自动化测试的抓取效率比较低,而且我确实很久没使用过这个了。本次只讨论使用cookie和发送表单两种方式来模拟登陆。

使用cookie

使用cookie的方式比较简单,基本思路就是登陆后用抓包工具或者类似chrome的F12调试界面查看cookie值,发送请求时带上cookie值即可


 

发送表单方式进行登陆

cookie是有有效期的,对于大量数据的抓取,更好的方式是发送表单进行模拟登陆。scrapy有专门的函数scrapy.FormRequest()用来处理表单提交。网上有些人说cookie没法保持,可以考虑用我下面的方式。


 

转载于:https://www.cnblogs.com/Pythonmiss/p/10607794.html

Scrapy是一个强大的Python爬虫框架,用于高效地抓取网站数据。如果你需要模拟登录某个网站,Scrapy可以配合第三方库如Requests或Selenium来完成这个过程。以下是基本步骤: 1. 安装依赖:首先,你需要安装`scrapy`、`requests`(默认支持HTTP请求)和`selenium`(如果目标网站有JavaScript验证)。 ```bash pip install scrapy requests selenium (如果需要) ``` 2. 创建Scrapy项目:使用`scrapy startproject your_project_name`命令创建一个新的Scrapy项目。 3. 导入必要的模块:在`settings.py`文件中添加对Selenium的支持,并设置一个中间件处理登录,例如: ```python DOWNLOADER_MIDDLEWARES = { 'your_project.middlewares.SeleniumMiddleware': 543, } ``` 4. 编写中间件(Middlewares):创建`middlewares/SeleniumMiddleware.py`文件,这里通常会使用`webdriver_manager`来管理浏览器驱动,然后初始化Selenium实例: ```python from scrapy import signals from selenium import webdriver from webdriver_manager.chrome import ChromeDriverManager class SeleniumMiddleware: def __init__(self): self.driver = webdriver.Chrome(ChromeDriverManager().install()) @classmethod def from_crawler(cls, crawler): middleware = cls() crawler.signals.connect(middleware.spider_opened, signal=signals.spider_opened) return middleware def spider_opened(self, spider): # 开启浏览器并导航到登录页面 self.driver.get(spider.login_url) def process_request(self, request, spider): if spider.is_login_required and 'login_form_data' in request.meta: # 提交表单数据,模拟登录 form_data = request.meta['login_form_data'] self.driver.find_element_by_name(form_data['username_field']).send_keys(form_data['username']) self.driver.find_element_by_name(form_data['password_field']).send_keys(form_data['password']) login_button = self.driver.find_element_by_css_selector(form_data['submit_button']) login_button.click() # 如果需要保持登录状态,可以在每个后续请求前检查cookie等信息 # ... return request ``` 5. 使用中间件:在Scrapy项目的spiders目录下,编写一个spider,将登录需求作为元数据传递给中间件: ```python class LoginSpider(scrapy.Spider): name = "login_spider" allowed_domains = ["example.com"] start_urls = ['http://example.com/login'] def is_login_required(self): return True def parse(self, response): # 登录成功后的解析逻辑 ... ``` 6. 设置登录数据和启动爬虫:在运行spider之前,指定登录表单的数据(用户名、密码、提交按钮等),然后通过`scrapy crawl`命令启动。 ```bash scrapy crawl login_spider -a login_form_data={"username_field": "username", "password_field": "password", "submit_button": ".btn-login"} ``` 注意:并非所有网站都支持直接模拟登录,某些网站可能需要验证码、OAuth授权等方式。此外,频繁的模拟登录可能会触发反爬机制或违反服务条款,因此在实际操作时需谨慎。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值