yyyying的blog

好好学习 天天向上

0%

网络爬虫学习(2)

网络爬虫学习笔记

课程名称:52讲学爬虫

1.4 Session & Cookies

HTTP无状态:HTTP协议没有记忆能力,无法了解登录状态
Session在服务端,本身含义指一段有始有终的一系列动作或消息。WEB中,Session对象用来存储特定用户所需的Session属性及配置信息
Cookies在客户端,为了辨别用户身份,进行Session跟踪

如何使用:客户端第一次请求服务器时,服务器返回相应头中带有Set-Cookie字段,客户端将数据保存。浏览器下次请求时,将Cookie放在请求头进行请求
Cookie如何查看:在开发者选项-> Application-> Cookies中查看

1.5&1.6 多线程 & 多进程

爬虫为I/O密集型任务,可以使用多线程

加锁保护:线程操作数据前加锁,如果数据被加锁,那么其他线程无法继续向下执行,释放锁以后才可以继续。

由于python GIL (Global Interpreter Lock)全局解释器锁,python多线程下:获取GIL->执行代码->释放GIL,因此python无法实现多核运算。

多进程无法共享全局变量。需要通过管道实现。
多进程主要使用:multiprocessing类实现
后续带代码实现。

1.7 Request库

请求测试网址:http://httpbin.org

GET方法传入参数用params
requests.get(url,params:,headers)
POST方法传入参数用data
requests.post(url,data:)
requests库内置到查询状态码方法:requests.code

高级用法:

文件上传

1
2
3
4
5
import requests

files = {'file': open('xxx.ico','rb')}
response = requests.post(http://httpbin.org/post, files=files)
print(response.text)

获取Set_Cookies

1
2
3
4
r = requests.get('http://www.baidu.com')
print(r.cookies)
for key,value in r.cookies.item():
print(key + '=' + value)

维持Session,使用Session对象

1
2
3
4
s = request.Session()
s.get('http://httpbin.org/cookies/set/number/123456789')
r = s.get('http://httpbin.org/gookies')
print(r.text)

SSL证书验证

使用verify参数控制是否验证证书,False则可以不验证证书进行访问,但是会有警告,以下两种方式取消警告

1
2
3
4
5
6
7
#设置忽略警告方式屏蔽警告
import requests
from requests.packages import urllib3

urllib3.disable_warnings()
r = requests.get(url, verify=False)
print(r.status_code)
1
2
3
4
5
6
#通过捕获到日志方式忽略警告
import requests
import logging
logging.captureWarnings(True)
r = requests.get(url, verify=False)
print(r.status_code)

或者指定本地证书座位客户端证书

1
2
3
import requests
r = requests.get(url,cert=('/path/server.crt','/path/server.key'))
print(r.status_code)

超时设置

使用timeout参数

1
2
r = requests.get(url, timeout=1)
print(r.status_code)

timeout分为连接和读取,可以使用元组分割:timeout=(5,5)

身份认证(弹窗输入用户名密码)

1
2
3
4
import requests
from requests.auth import HTTPBasicAuth

r = requests.get(url, auth=HTTPBasicAuth('admin','0000'))

可以简化为元组
r = requests.get(url, auth=('admin','0000'))

还可以使用OAuth认证,但需要安装oauth认证包

代理设置

使用proxies参数

1
2
3
4
5
6
7
import requests

proxies = {
'http':'http://0.0.0.0:1080'
'https':'https://0.0.0.0:1080'
}
r = requests.get(url,proxies=proxies)
1
2
3
#代理需要身份验证
proxies = {'https':'https://user:password@0.0.0.0:1080'}
r = requests(url,proxies=proxies)

Prepared Request对象

Request对象实例化,方便操做

1
2
3
4
5
6
7
8
9
10
from requests import Request,Session

url = 'xxx'
data = {'a':'b'}
headers = {'c':'d'}
s = Session()
req = Request('POST', url, data=data, headers=headers)
prepped = s.prepared_request(req)
r = s.send(prepped)
print(p.text)