python爬虫基础
爬虫:模拟客户端(浏览器),发送网络请求
入门阶段,还有很多东西需要深究、探索
前提
要知道
- url = 请求协议 + 网站的域名 + 资源的路径 + 参数
- 浏览器请求的 url 地址,拿到的 response 里面有一些 js、css、html 等内容。也就是所一条 url 请求返回的东西有很多
- 浏览器中 element 中的内容和爬虫中获得的 url 地址响应不同,所以需要以当前的 url 地址对应的响应为准。在 network 中可以找到,点击里面的 response(页面上点击右键显示网页源码
- http:超文本传输协议。以明文的形式传输,效率高但是不安全
- https:http + ssl(安全套接字层
- 传输之前数据加密,后来再通过解密获取内容。效率低但是安全
前提知识
http 协议 - 请求
- 请求行:浏览器中可以找到的那个 request
- 请求头
- user-agent:用户代理,服务器通过这个知道在请求资源的是什么设备、平台、浏览器
- 如果是模拟手机来请求服务器,就得使用手机的 user-agent
- cookie:用来存储用户信息,每次请求都传给服务器
- 一般在面对要登录的页面的时候会使用到 cookie
- 这样就在一定程度上防止浏览器知道是在爬虫
- user-agent:用户代理,服务器通过这个知道在请求资源的是什么设备、平台、浏览器
- 请求体:get 请求没有,post 请求有
- 就是携带数据的,get 请求的数据在 url 上,post 的数据在请求体里
- post 能携带的数据量比较大,t 一般用于登录注册、用于传输大文本的时候
http 响应
- 响应头:set-cookie,对方服务器通过这个字段设置 cookie 到本地
- 等号前的是 cookie 的 name ,后的是 cookie 的 _value_,分号等额每一条 cookie
- 响应体:url 地址对应的响应
requests
python 爬虫的关键所在,第三方模块。
安装:
1 | $ pip install requests |
使用:直接引入
1 | import requests |
发送 get_、_post 请求
response = requests.get( url )
response = requests.post( url, data={ 请求体的字典 } )
1
2
3
4
5
6
7
8
9
10
11url = "xxxxx"
query_string = {
"xxx": "zzz",
"hhh": "sss"
}
headers = {
"user-agent": "qweasdzxc",
"cookie": "ahhxixilala"
}
response = requests.post(url, data=quert_string, headers=headers)
print(response.content.decode())- 除了使用
cookie
来记录用户,还可以使用session
来记录用户
- 除了使用
response的方法
response.text():这个方法如果出现乱码,就使用
response.encoding="utf-8"
1
2
3
4
5# 获取网页的html字符串
response = requests.get(url)
# 返回的是随机的编码,一般情况下直接 .text 可以得到,如果不行,就加上这个编码
response.encoding = "utf-8"
print(response.text)response.content.decode():把响应的二进制字节流转化为 str 类型
response.request.url:发送请求的 ur l 地址
response.url:response 响应的 url 地址
response.request.headers:请求头
response.headers:响应请求
获取源码的方式(这三种方式一定能获得网页正确解码后的字符串)
- response.content.decode()
- response.content.decode(“gbk”)
- response.text
requests.session
这里是使用了 session 来代替了 cookie
实例化 session
1
session = requests.session()
例子
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15# 使用 session 发送 post 请求,获取服务器在本地保存的 cookie,比如登录
post_url = "xxxssswww"
headers = {
"user-agent": "zxcasdqwe"
}
post_data = {"username": "jerry", "password": "123456"}
session.post(post_url, headers=headers, data=post_data)
# 可再次使用session,请求登录之后的页面
url = "xxxxxx"
response = session.get(url, headers=headers)
# 将内容保存到一个新的文件
with open("test.html", "w", encoding="utf-8") as f:
f.write(response.content.decode())
数据提取方法
json
一种数据交换的格式,一般吧网页切换成 手机版 会返回 json 类型的数据。导入:import json
,内部模块,不需要使用 pip 下载
json.load
把 json 字符串转化为 python 类型- json.load(json 字符串)
json.dumps
把 python 类型转化为字符串- json.dumps( { } )
- json.dumps( val, ensure_ascii=False, indent=2 )
- ensure_ascii=False:让中文显示成中文,False 首字母要大写
- indent:让下一行在上一行的基础上空格
- json.dumps( val, ensure_ascii=False, indent=2 )
- json.dumps( { } )
xpath 和 lxml
xpath
xpath helper :一款浏览器插件,可以在浏览器的 elements
中定位数据
使用方法:
/html/head/meta
:选中 html 中 head 下的所有 meta 标签//
:从任意节点开始选择//li
:当前页面上的所有 li 标签/html/head//link
:head 下的所有 link 标签@
- 选择具体某个元素:
//div[@class='app']/ul/li
(选择了 class 名为 app 下的 ul 下的 li) @a/@href
:选择 a 标签下的 href 值
- 选择具体某个元素:
- 获取文本:
/a/text()
:获取 a 下面的文本/a//text()
:获取 a 下面的所有文本
.
./a
:当前节点下的 a 标签
lxml
安装:$ pip install lxml
使用:
1 | from lxml import etree |
例如 1
1 | html_str = response.content.decode() |
例如 2,获取网页上的多种类型数据(接上)
1 | ret1 = html.xpath("//div[@class='indent']/div/table") # 设置前缀,后面的使用就不需要重新写这些相同的部分 |
- strip() 方法用于移除字符串头尾指定的字符(默认为空格或换行符)或字符序列
例子
前提安装:requests,lxml
网页数据的结构可能已经改变,了解爬虫思路就好了
1 | import requests |
小结
- 知道要爬取的 url 和 url 的规律,比如翻页什么的、
- 使用 requests 发送请求,获取响应
- 提取数据
- 返回 json 字符串,使用 json 模块
- 返回的是 html 字符串,使用 lxml 模块 搭配 xpath 提取数据
- 保存数据
加油,脚踏实地。