Day05回顾
动态加载网站数据抓取
1、F12打开控制台,页面动作抓取网络数据包
2、抓取json文件URL地址
# 控制台中 XHR :异步加载的数据包
# XHR -> Query String(查询参数)
有道翻译流程梳理
1. 打开首页
2. 准备抓包: F12开启控制台
3. 寻找地址
页面中输入翻译单词,控制台中抓取到网络数据包,查找并分析返回翻译数据的地址
4. 发现规律
找到返回具体数据的地址,在页面中多输入几个单词,找到对应URL地址,分析对比 Network - All(或者XHR) - Form Data,发现对应的规律
5. 寻找JS文件
右上角 ... -> Search -> 搜索关键字 -> 单击 -> 跳转到Sources,左下角格式化符号{
}
6、查看JS代码
搜索关键字,找到相关加密方法,分析并用python实现
7、断点调试
8、完善程序
cookie模拟登陆
1、适用网站类型: 爬取网站页面时需要登录后才能访问,否则获取不到页面的实际响应数据
2、方法1(利用cookie)
1、先登录成功1次,获取到携带登陆信息的Cookie(处理headers)
2、利用处理的headers向URL地址发请求
3、方法2(利用session会话保持)
1、登陆,找到POST地址: form -> action对应地址
2、定义字典,创建session实例发送请求
# 字典key :<input>标签中name的值(email,password)
# post_data = {'email':'','password':''}
Day06笔记
cookie模拟登录
- 适用网站及场景
抓取需要登录才能访问的页面
- 方法一
1、先登录成功1次,获取到携带登陆信息的Cookie
F12打开控制台,在页面输入用户名、密码,登录成功,找到/home(一般在抓到地址的上面)
2、携带着cookie发请求
** Cookie
** Referer(源,代表你从哪里转过来的)
** User-Agent
import requests
from lxml import etree
# url为需要登录才能正常访问的地址
url = 'http://www.renren.com/969255813/profile'
# headers中的cookie为登录成功后抓取到的cookie
headers = {
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3",
"Accept-Encoding": "gzip, deflate",
"Accept-Language": "zh-CN,zh;q=0.9",
"Connection": "keep-alive",
# 此处注意cookie,要自己抓取
"Cookie": "",
"Host": "www.renren.com",
"Referer": "http://www.renren.com/SysHome.do",
"Upgrade-Insecure-Requests": "1",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36",
}
html = requests.get(url,headers=headers).text
# 解析
parse_html = etree.HTML(html)
result = parse_html.xpath('//*[@id="operate_area"]/div[1]/ul/li[1]/span/text()')[0].strip()
# result:就读于中央戏剧学院
print(result)
- 方法二
- 知识点
利用requests模块中的session会话保持功能
- session会话使用流程
1、实例化session对象
session = requests.session()
2、让session对象发送get或者post请求
res = session.get(url,headers=headers)
- 具体步骤
1、寻找登录时POST的地址
查看网页源码,查看form,找action对应的地址: http://www.renren.com/PLogin.do
2、发送用户名和密码信息到POST的地址
* 用户名和密码信息以什么方式发送? -- 字典
键 :<input>标签中name的值(email,password)
值 :真实的用户名和密码
post_data = {
'email':'','password':''}
- 程序实现
整体思路
1、先POST: 把用户名和密码信息POST到某个地址中(一般是form表单中action的地址)
2、再GET: 正常请求去获取页面信息
import requests
from lxml import etree
# 定义常用变量
post_url = 'http://www.renren.com/PLogin.do'
post_data = {
'email' : 'xxxxxx',
'password' : 'xxxxxx'
}
headers = {
'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36',
'Referer' : 'http://www.renren.com/SysHome.do'
}
# 实例化session会话保持对象
session = requests.session()
# 先POST,把用户名和密码信息POST到一个地址
session.post(post_url,data=post_data,headers=headers)
# 再get个人主页
url = 'http://www.renren.com/970294164/profile'
html = session.get(url,headers=headers).text
parse_html = etree.HTML(html)
result = parse_html.xpath('//*[@id="operate_area"]/div[1]/ul/li[1]/span/text()')[0].strip()
print(result)
百度翻译破解案例
目标
破解百度翻译接口,抓取翻译结果数据
实现步骤
-
1、F12抓包,找到json的地址,观察查询参数
1、POST地址: https://fanyi.baidu.com/v2transapi 2、Form表单数据(多次抓取在变的字段) from: zh to: en sign: 54706.276099 #这个是如何生成的? token: a927248ae7146c842bb4a94457ca35ee # 基本固定,但也想办法获取
-
2、抓取相关JS文件
右上角 - 搜索 - sign: - 找到具体JS文件(index_c8a141d.js) - 格式化输出
3、在JS中寻找sign的生成代码
1、在格式化输出的JS代码中搜索: sign: 找到如下JS代码:sign: m(a),
2、通过设置断点,找到m(a)函数的位置,即生成sign的具体函数
# 1. a 为要翻译的单词
# 2. 鼠标移动到 m(a) 位置处,点击可进入具体m(a)函数代码块
4、生成sign的m(a)函数具体代码如下(在一个大的define中)
function a(r) {
if (Array.isArray(r)) {
for (var o = 0, t = Array(r.length); o < r.length; o++)
t[o] = r[o];
return t
}
return Array.from(r)
}
function n(r, o) {
for (var t = 0; t < o.length - 2; t += 3) {
var a = o.charAt