-
cookie
-
是存储在客户端的一组键值对。
-
web中cookie的典型应用
- 免密登录
- 登录状态
-
cookie和爬虫的关系
- 对页面请求时,如果请求的过程中不携带cookie,无法请求到正确的页面数据。所以是它是常见的反爬机制。
- cookie的处理方式
- 手动处理
- 复制粘贴
- 弊端:有有效时长
- 自动处理
- 基于session对象实现自动处理
- requests.session()
- session对象的作用:
- 该对象可以像requests一样调用get和post发起指定的请求。只不过如果在使用session发请求的过程中产生了cookie,则cookie会被自动存储在session对象中,那么下次再次使用session请求时,就携带cookie进行了请求。
- 在使用session的时候,session对象至少会被使用两次。
- 手动处理
-
例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
# 需求:爬取雪球网中的咨询信息。https://xueqiu.com/ # 分析:判定爬取的数据是否是动态加载:部分数据是动态加载 # 定位到ajax请求的数据包,提取处请求的url,响应数据为json形式的数据 import requests headers = { 'User-Agent': 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:80.0) Gecko/20100101 Firefox/80.0' } session = requests.session() # 创建session main_url = 'https://xueqiu.com/' session.get(main_url, headers=headers) # 捕获且存储cookie url = 'https://xueqiu.com/statuses/hot/listV2.json?since_id=-1&max_id=176631&size=15' page_text = session.get(url=url, headers=headers).json() print(page_text)
-
-
代理机制
-
在爬虫中代理就是代理服务器
-
代理服务器的作用是转发请求和响应。
-
短时间内对服务器发起了高频的请求,那么服务器会检测到这样的一个异常的行为请求,就会将该请求对应设备的ip禁掉。
-
如果ip被禁,则可以使用代理服务器。
-
代理服务器不同的匿名程度:
- 透明代理:server知道你使用了代理且知道你的真实ip
- 匿名代理:知道你使用了代理,但是不知道你的真实ip
- 高匿代理:不知道你是使用了代理也不知道你的真实ip
-
代理的类型:
- https:只能转发https协议的请求
- http:转发http的请求
-
代理服务器:
-
快代理
-
西祠代理
-
goubanjia
-
代理精灵
-
封装代理池
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
# 代理池 from lxml import etree import requests url = '放代理地址' headers = { 'User-Agent': 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:80.0) Gecko/20100101 Firefox/80.0' } page_text = requests.get(url, headers=headers).text tree = etree.HTML(page_text) proxy_list = tree.xpath('//body//text()') http_proxy = [] for proxy in proxy_list: dic = { 'http': proxy } http_proxy.append(dic)
-
使用代理
1 2 3
# request = requests.get(url, headers=headers, proxies={'http':ip:port}) # xpath解析式中不能出现tbody标签 request = requests.get(url, headers=headers, proxies=random.choice(http_proxy))
-
-
-
验证码识别
-
基于线上的打码平台识别验证码
-
打码平台
-
超级鹰
-
创建软件id
-
下载示例代码
-
封装功能
1 2 3 4 5
import chaojiying def tanfoormImgCode(path, type): chaojiying1 = chaojiying.Chaojiying_Client('用户名', '密码', '软件id') im = open(path, 'rb').read() return chaojiying1.PostPic(im, type)['pic_str']
-
-
云打码
-
打码兔
-
-
-
模拟登录
- 流程:
- 对点击登录按钮对应的请求进行发送(get)
- 处理请求参数:
- 用户名
- 密码
- 验证码
- 其他防伪参数
- cookie(session)
- 乱序请求参数(可能动态)
- 处理方式1:一般动态变化的请求参数会被隐藏在前台页面中,在页面源码中搜索即可。
- 处理方式2:如果前台页面没有,则机遇抓包工具进行全局搜索。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
import requests from lxml import etree from chaojiying import tanfoormImgCode headers = { 'User-Agent': 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:80.0) Gecko/20100101 Firefox/80.0' } # 识别验证码 session = requests.session() # 创建session捕获cookie url = 'https://so.gushiwen.cn/user/login.aspx?from=http://so.gushiwen.cn/user/collect.aspx' page_text = session.get(url, headers=headers).text tree = etree.HTML(page_text) img_src = 'https://so.gushiwen.cn' + tree.xpath('//*[@id="imgCode"]')[0] img_data = session.get(img_src, headers=headers).content with open('./code.jpg', 'wb') as fp: fp.write(img_data) # 识别验证码 code_text = tanfoormImgCode('./code.jpg', 1902) login_url = 'https://so.gushiwen.cn/user/login.aspx?from=http%3a%2f%2fso.gushiwen.cn%2fuser%2fcollect.aspx' data = { '__VIEWSTATE': '9Qg1T/fXvI3ef41DzaaaK7bfCyhDl4c3E3RS1rYNfMx4QF5zKHU43xQ2JKqM2PVNkn228ZRjSIh5F0yXq5gYfAdSZSSBctGUiqunsGgE/NKcajrSMIqiXihWMj0=', '__VIEWSTATEGENERATOR': 'C93BE1AE', 'from': 'http://so.gushiwen.cn/user/collect.aspx', 'email': '33192475@qq.com', 'pwd': 'j33192475', 'code': code_text, # 动态订婚 'denglu': '登录', } # 对点击登录发起请求 page_text_login = session.post(login_url, headers=headers, data=data).text print(page_text_login) # TODO jupyter魔法指令 # TODO 正则 # TODO 梨视频爬取
- 流程:
-
基于百度AI实现的爬虫功能
- 图像识别
- 语音识别&合成
- 自然语言处理
- 使用流程:
- 登录后在相应功能下创建app
- 选择对应的pythonSDK文档进行代码实现
-
梨视频爬取思路
- 将每一个视频详情页的url进行解析
- 对视频详情页的url进行请求发送
- 在视频详情页的页面源码中进行全局搜索,发现没有找到video标签
- video是动态加载
- 动态加载的数据方式
- ajax
- js
- 通过正则匹配出视频地址