爬虫
概念:网络爬虫(又被称为网页蜘蛛,网络机器人),一中按照一定规则抓取网络信息的程序
原理:模拟客户端发送请求,接收请求响应
一、爬虫分类
通用爬虫:一般指搜索引擎的爬虫
聚焦爬虫:针对特定网站的爬虫
二、爬虫的流程
1、聚焦爬虫的工作流程
1.1 聚焦爬虫的工作流程图:
graph TD A[url list] -->B[响应内容] B-->D[提取数据] B-->C[提取url] C-->A D-->E[入库]
1.2 搜索引擎工作流程图
graph TD 抓取网页数据-->数据存储-->预处理-->提供检索服务
1.3 浏览器的请求过程
浏览器获取的数据包含: url地址对应的响应 +js+CSs+jpg
爬虫会获取:url地址对应的响应
爬虫获取的内容和elements内容不一样,进行数据提取的时候,需要根据url地址对应的响应为准
1.4 robots协议(身份标识)
robots协议:网站通过robots协议告诉搜索引擎那些网页可以抓取,那些不能,但仅仅是道德层面的约束
1.5 requests发送简单请求
response = requests.请求方法(
url)response的常用方法:
response.textresponse.content:响应类型response.status_code:响应状态码response.request.heades:请求头response.headers:响应头判断请求是否成功:assert response.status_code==200
发送
get带参请求:参数形式为字典,用法:requests.get(url,params={})字符串格式化的另一种方式
1
"xxx{}xxx".format(1)
发送
post请求——用法:response = requests.post(url,data=字典 ,headers=headers)
1.6使用代理
1、 用法:requests.请求方法(url,proxies=字典)
proxies = {"http": "", "https": ""}
可创建一个代理ip池提高速度
2、分类:
1)透明代理
REMOTE_ADDR = Proxy IP
HTTP_VIA = proxy IP
http_X_FORWARDED_FOR = You IP
2)匿名代理
REMOTE_ADDR = Proxy IP
HTTP_VIA = proxy IP
http_X_FORWARDED_FOR = You IP
3)混淆代理
REMOTE_ADDR = Proxy IP
HTTP_VIA = proxy IP
http_X_FORWARDED_FOR = Random IP address
4)高匿代理
REMOTE_ADDR = Proxy IP
HTTP_VIA = not determined
http_X_FORWARDED_FOR = not determined
1.7 coke和session
区别:
- cookie数据存放在客户的浏览器上,session数据放在服务器上
- cookie不是很安全,别人可以分析存放在本地的cookie并进行cookie欺骗。
- session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能。
- 单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。
优点:
带上cookie和session能够请求登录后的网页
弊端:一套cookie和session往往和一个用户对应,请求太快次数太多容易被服务器识别为爬虫
不需要cookie的时候尽量不去使用
1. session处理cookie相关请求
request提供session来实现客户端和服务端进行会话保持
会话保持的内涵:
1)保存cookie
2)实现服务端长链接
使用方法
session = request.session()
response = session.get(url, headers)
2.cookies处理cookie相关请求
cookies的形式:字典
1
cookies = {"cookie":"value"}
使用方法:
1
request.get(url,headers=hearder,cookies=cookie_dicr)
使用已有cookie生成cookie字典
1
cookie_dict = {i.split("=")[0]:i.split("=")[1] for i in cookie.split(";")}
cookie里有用的是name和value
可以使用request.utils.dict_from_cookiejar:将cookie转为字典
1
cookies = request.utiles.dict_from_cookiejar(cookie)
ssl 证书验证错误:
返回错误信息内容:
ssl.CertificateError...解决:在请求方法中添加参数
verify=False
超时参数的使用
在超时后进行强制执行:
response =requests.get(url,timeout=3)- 可以使用来验证代理ip
retry的使用
当超时报错时重复执行指定次数后再跳过
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23# coding=utf-8
import requests
from retrying import retry
headers = {}
def _parse_url(url):
print('*'*100)
response = requests.get(url, headers=headers, timeout=3)
assert response.status_code == 200
return response.content.decode()
def parse_url(url):
try:
html_str = _parse_url(url)
except Exception as e:
html_str = None
return html_str
if __name__ == '__main__':
url = "www.baidu.com"
print(parse_url(url))多线程爬虫
使用threading创建多线程
- threading
- t1 = threading.Thread(targe=func, args=(,))
- t1.setDaemon(True) # 守护线程
- t1.start()
- 队列
- q.join() # 阻塞主线程,让主线程等待队列任务结束之后在结束,队列任务在计数为0时
- q.task_done()和get()方法配合使用队列数-1
- q.put()队列数+1
- threading


