四、验证码
4.1、简介
验证码是一种反爬机制。
识别验证码图片中的数据,用于模拟登陆操作。
4.2、识别方式
人工肉眼识别。(不推荐)
第三方自动识别(推荐)
4.3、第三方识别平台——超级鹰
4.3.1、使用教程
注册:普通和开发者用户
登录:
普通用户的登录:
查询该用户是否还有剩余的题分
开发者用户的登录:
创建一个软件:
我的软件一》添加新软件-》录入软件名称-》提交((软件id 和秘钥)
下载示例代码:
开发文档一》常用开发语言示例下载(选择python)
4.4、模拟cookie
4.4.1、手动处理
通过抓包工具获取cookie值,将该值封装到headers中。(不建议)
4.4.2、自动处理
cookie值的来源:
模拟登录post请求后,由服务器端创建。
session会话对象:
作用:
1.可以进行请求的发送。
2.如果请求过程中产生了cookie,则该cookie会被自动存储/携带 在该session对象中。
使用步骤:
▶ 使用session对象进行模拟登录post请求的发送(cookie就会被存储在session中)
▶ session对象对个人主页对应的get请求进行发送(携带了cookie)
4.5、案例
模拟登陆
import requests
from lxml import etree
from requests import session
url = "https://so.gushiwen.cn/user/" \
"login.aspx?from=http://so.gushiwen.cn/user/collect.aspx"
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:86.0) Gecko/20100101 Firefox/86.0"
}
page_text = requests.get(url=url, headers=headers).text
tree = etree.HTML(page_text)
code_img_url = "https://so.gushiwen.cn" + \
tree.xpath("//img[@id='imgCode']/@src")[0]
code_img = requests.get(url=code_img_url, headers=headers).content
with open("yanzhengma.jpg", "wb") as fp:
fp.write(code_img)
code = input("验证码")
data = {
'__VIEWSTATE': "p/iyzbvKF80QivK5Al1qo5BeWQRLdqxT8tKtH2yVwZsN70le8af9GiEAdeo22f7RPIFTUD0hSC0rIArS8MD9sex8I5eqAUV0Bwzm9On6L/blvREPmp4BYPlX2e0=",
'__VIEWSTATEGENERATOR': "C93BE1AE",
'from': "http://so.gushiwen.cn/user/collect.aspx",
'email': "1912383953@qq.com",
'pwd': "LmJB5ivGBxqTwKf",
'code': code,
'denglu': "登录",
}
login_url = "https://so.gushiwen.cn/user/login.aspx?from=http%3a%2f%2fso.gushiwen.cn%2fuser%2fcollect.aspx"
# 使用session进行post请求的发送
response = session.post(url=login_url, data=data, headers=headers)
print(response.status_code)
# 使用携带cookie的session进行get请求的发送
五、代理
5.1、代理简介
代理服务器
代理作用:
突破自身IP访问的限制。
隐藏自身真实IP
参考网站:快代理、西祠代理、www.goubanjia.com
代理ip的类型:
http:应用到http协议对应的url中
https:应用到https协议对应的url中
代理ip的匿名度:
透明:服务器知道该次请求使用了代理,也知道请求对应的真实ip。
匿名:知道使用了代理,不知道真实ip。
高匿:不知道使用了代理,更不知道真实的ip。
5.2、破解封ip的反爬机制
六、异步爬虫
6.1、目的
在爬虫中使用异步实现高性能的数据爬取操作。
6.2、异步爬虫方式
6.2.1、多线程,多进程(不建议):
好处:
可以为相关阻塞的操作单独开启线程或者进程,阻塞操作就可以异 步执行。
弊端:
无法无限制的开启多线程或者多进程。
6.2.2、线程池、进程池:
好处:
我们可以降低系统对进程或者线程创建和销毁的一个频率,从而很好的降低系统的开销。
弊端:
池中线程或进程的数量是有上限。
6.2.3、单线程+异步协程(推荐) :
event_loop:事件循环,相当于个无限循环,我们可以把一 些函数注册到这个事件循环上,当满足某些条件的时候,函数就会被循环执行。
**Coroutine:**协程对象,我们可以将协程对象注册到事件循环中,它会被事件循环调用。可以使用async 关键字来定义一个方法,这个方法在调用时不会立即被执行,而是返回一个协程对象。
**Task:**任务,它是对协程对象的进一步封装, 包含了任务的各个状态。
**Future:**代表将来执行或还没有执行的任务,实际上和task没有本质区别。
**Async:**定义一个协程。async修饰的函数。调用之后返回的一个协程对象。
**Await:**用来挂起阻塞方法的执行。