·# 爬虫概念、工具和Http
1. 什么是爬虫
- 爬虫就是***模拟客户端(浏览器)发送网络请求***,获取响应,按照规则提取数据的程序
- 模拟客户端(浏览器)发送网络请求:照着浏览器发送一摸一样的请求,获取和浏览器一模一样的数据
2. 爬虫的数据去哪了
- 呈现出来:展示在网页上,或者展示在app上
- 进行分析:从数据中寻找一些规律
3. 需要的软件和环境
- python3(函数,面向对象)
- pycharm
- chrome浏览器
- 分析网络请求用的
4. 浏览器的请求
- url
- 在chrome打开开发者面板,找到network,可以用url解码解解出来
- url = 请求的协议 + 网站的域名 + 资源的路径 + 参数
- 浏览器请求url地址
- 爬虫不能把得到的js和css渲染到一起,无法组成elements
- 当前url对应的响应+js+css+图片–》elements中的内容
- 爬虫请求url地址
- 当前url对应的响应
- elements的内容和爬虫获取的url地址的响应不同,爬虫需要以当前url地址对应的响应为准提取数据
- 当前url地址对应的响应
- 从network中找到当前url的地址,点击response
- 在页面上显示网页源码
5. 认识HTTP,HTTPS
- HTTP:超文本传输协议
- 以明文的形式传输,
- 效率更高,但是不安全
- HTTPS:HTTP + SSL(安全套接字层)
- 传输之前,数据先加密,之后解密,获取内容
- 效率较低,但是安全
requests模块的学习
使用前
- pip install requests
发送get,post请求,获取响应
- response = request.get(url):发送get请求,获取url地址对应的响应
- response = request.post(url, data={请求体的字典}):发送post请求,获取url地址对应的响应
response的方法
- response.text属性,response.text
- 该方式通常会乱码,出现乱码使用
获取网页的html字符串
response.encoding = ‘utf-8’
解码用decode()方法
- response.content.decode():把响应的二进制字节流转换为str类型
- response.request.url:发送请求的url地址
- response.url:response响应的url地址
- response.request.headers:请求头
- response.headers:响应请求
获取网页源码的正确打开方式(通过下面三种方式一定能获得正确解码后网页的字符串)
- response.content.decode()
- response.content.decode(“gbk”)
- response.text
get 和 post请求皆可使用
有时response得不到数据,是因为服务器已经知道我们是个爬虫,就不给我们数据了
带上header就行
发送带header的请求
为了模拟浏览器更像,获取和浏览器一模一样的内容
- headers = {里面放参数,键值对要放好}
一般用User-Agent就行了,不行的话就把其他的属性带上,最后再不行就带上cookie
使用超时参数
强制返回响应,在指定的时间内
- requests.get(url, headers=headers, tiemout=3):3秒内必须返回响应,否则会报错
retrying模块学习
from retrying inport retry
@retry(stop_max_attempt_number=3)//执行三次,三次错误后才报错,三次内成功则往下走
def fun1():
print("this is func1")
rasie ValueError('this is test error')
处理cookie相关的请求
- 直接携带cookie访问url地址
-
cookie直接放在header
headers={'User-Agent':'...',"cookie":'cookie 字符串'}
-
cookie字典可以传给cookies参数
cookie_dict={i.split('=')[0]: i.split("=")[-1]for i in cookie.split(';')} response.get(url, cookies=cookie_dict)
-
先发送post请求,获取cookie,带上cookie请求登录后的页面
1. session = requests.session()# session具有的方法和requests一样 2. session.post(url, data, headers)# 服务器设置在本地的cookie会存在sesssion 3. session.get(url) #会带上之前保存在session中的cookie,能够请求成功
数据提取方法
json
数据交换格式,看起来像是python类型(列表,字典)的字符串
使用前,先导入:import json
json.loads
把json字符串转换为python类型
json.loads(json字符串)
dict_ret = json.loads(html_str)
print(type(dict_ret))# dict
json.dumps
把python类型转化为json字符串
json.dumps{‘a’:‘aa’,‘b’:‘bb’}
json.dumps(字典,ensure_ascii=False) # 表示不用ascii码保存,显示出中文
json.dumps(字典,ensure_ascii=False,indent=2) # 在下一行在上一行的基础上空两格
哪里会返回json的数据
- 浏览器切换到手机版
- 抓包app
豆瓣爬虫案例
Referer字段对于防止爬取数据很有用
xpath和lxml
xpath
一门从html中提取数据的语言,有xpath helper插件:可以帮我们从elements中定位数据
使用
- 选择节点(标签):
/html/head/meta
:选择html下的head的所有meta标签 - 选择当前节点(标签):
2-1.//
:能都从任意节点开始选择*** ,可以跟/
连用
2-2.//li
:选择所有li标签 - @符号的用处
- 定位元素:
//div[@class='属性值']/ul/li
:获得属性值为指定的div下的ul下的li []
用于修饰,单写@+属性
是获得属性值:/a/@href
:获取href里的文本text()
:获取标签包裹的文本:/a/text()
:获取a标签里的文本。/a//text()
:获取a标签下的所有文本
lxml
安装
pip install lxml
使用
不能在element里写,要在源码里写
from lxml import etree
element = etree.HTML('html字符串') # 转化为一个element对象,element才能使用xpath语法
list = element.xpath('语法') # 返回一个列表
element = hrml_str.xpath('div/table') # 如果取到的不是字符串,而是一个标签,就会变成一个element对象
三元运算符
a = 10 if 4>3 else 20 # 10
a = 10 if 4<3 else 20 # 20