爬虫介绍
爬虫是什么?
- 网页蜘蛛,网络机器人,spider
- 在互联网中 通过 程序 自动的抓取数据 的过程
- 根上:使用程序 模拟发送http请求 ⇢ \dashrightarrow ⇢ 得到http响应 ⇢ \dashrightarrow ⇢ 把响应的数据解析出来 ⇢ \dashrightarrow ⇢ 存储起来
做爬虫需要掌握的技术
- web端爬虫(网页)
- 抓包:抓包工具 ⇢ \dashrightarrow ⇢ 浏览器,charles,fiddler
- 发送http请求的模块
- requests:同步的 ⇢ \dashrightarrow ⇢ 不仅仅做爬虫用 调用第三方api就可以使用
- request-html:
- aiohttp:异步的http模块
- 解析库:http响应
⇢
\dashrightarrow
⇢ 可能是xml,html,json,文件,图片…
⇢
\dashrightarrow
⇢ 响应中解析出想要的数据
- beautifulsoup4 ⇢ \dashrightarrow ⇢ xml/html
- lxml ⇢ \dashrightarrow ⇢ xml/html
- selenium ⇢ \dashrightarrow ⇢ 请求加解析(本质是模拟浏览器)
- json
- 存储:mysql,redis,es,mongodb…
- pymysql:aiomysql
- redis:aioredis
- elasticsearch.py
- py-mongo
- 移动端爬虫(app)
- 抓包,发请求,解析,存储跟web一样的
- 对app进行反编译
⇢
\dashrightarrow
⇢ jadx
- 安卓:java写的app ⇢ \dashrightarrow ⇢ 把app反编译成java ⇢ \dashrightarrow ⇢ 懂java ⇢ \dashrightarrow ⇢ 看懂逻辑 ⇢ \dashrightarrow ⇢ 使用python模拟这个过程
- hook技术 ⇢ \dashrightarrow ⇢ frida
- c语言写加密—》用java调用c语言的加密方式—》xx.so–>动态链接库文件
- 反编译 so文件—》IDA—》反编译成汇编和c
- 动态调试
- python模拟这个过程即可
- 反扒
- 请求头反扒:user-agent,referfer:上一个访问的地址是什么
- 反扒:无限调试
- 封ip
⇢
\dashrightarrow
⇢ ip代理池
-封账号 ⇢ \dashrightarrow ⇢ cookie池
-js加密 ⇢ \dashrightarrow ⇢ js逆向
动态链接库
百度,谷歌 搜索引擎本质其实就是个大爬虫
⇢
\dashrightarrow
⇢ 不停的在互联网上爬取页面
⇢
\dashrightarrow
⇢ 存到自己的库中
使用搜索的时候
⇢
\dashrightarrow
⇢ 去百度的数据库中查询相关的关键字
⇢
\dashrightarrow
⇢ 显示在页面上
⇢
\dashrightarrow
⇢ 当我们点击某一个
⇢
\dashrightarrow
⇢ 真正的跳转到 真正的搜索到的页面
百度做爬取时
⇢
\dashrightarrow
⇢ 对动态页面的爬取权重要低
seo优化
⇢
\dashrightarrow
⇢ 保证我们公司的网站通过关键字搜索,显示在第一个
- 伪静态
⇢
\dashrightarrow
⇢
sem:付费买关键词
requests模块快速使用
介绍:
使用requests可以模拟浏览器的请求,比起之前用到的urllib(内置模块),requests模块的api更加便捷(本质就是封装了urllib3)
注意:
requests库发送请求将网页内容下载下来以后,并不会执行js代码,这需要我们自己分析目标站点然后发起新的request请求
- 混合项目 ⇢ \dashrightarrow ⇢ 拿回来的页面—带数据
- 分离项目 ⇢ \dashrightarrow ⇢ 拿回来的页面 ⇢ \dashrightarrow ⇢ 数据是空的 ⇢ \dashrightarrow ⇢ 再分析接口 ⇢ \dashrightarrow ⇢ 再发请求才能拿到真正的数据
看到一个页面有数据 ⇢ \dashrightarrow ⇢ 用requests发送请求 ⇢ \dashrightarrow ⇢ 拿回来的,可能跟看到的不一样
快速使用
- 安装模块:
pip install requests
- 使用:
import requests # res中会有:http响应 响应头的,响应体的 res = requests.get('https://www.cnblogs.com/') # 响应体的文本字符串(可能会乱码) print(res.text)```
get请求携带请求参数
- 方式一:直接拼在后面
res=requests.get('https://www.cnblogs.com/?ordering=-id&search=课程')
- 方式二:使用params参数
res=requests.get('https://www.cnblogs.com/',params={'ordering':'-id','search':'课程'}) print(res.text)
url 编码和解码
获得的网页内容可能会出现:%E7%BE%8E%E5%A5%B3
不是乱码
⇢
\dashrightarrow
⇢ url编码了
url解码
res=parse.unquote('%E7%BE%8E%E5%A5%B3')
print(res)
url编码
res=parse.quote('刷币')
# %E5%88%B7%E5%B8%81
print(res)
携带请求头
请求头中可能有的:User-Agent,referer,cookie,Host
- User-Agent:是消息头,可以在该消息头内了解到该网站所支持的浏览器同时可以知道访问该网站所用的浏览器以及浏览器版本,还能了解登录用的操作系统以及系统是多少位的。
- referer:代表从哪里来到当前页面进行访问的,百度推广就是通过referer进行的统计来访人数。不带referer可以直接下载带referer说明有防盗链。
- host:代表主机已百度为例,网址中www.baidu.com的host就是www.baidu.com
http1.1后面的1.1代表版本的协议号 ,分为1.0和1.1两个版本,发部分使用1.1版本,且 1.1版本必须要host请求头
header = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36'
}
res = requests.get('https://www.sogou.com/web?query=%E7%BE%8E%E5%A5%B3', headers=header)
# res=requests.request('get','url',headers=header)
print(res.text)