1.爬虫简介
1.1 什么是爬虫
网络爬虫(又称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。另外一些不常使用的名字还有蚂蚁、自动索引、模拟程序或者蠕虫。
1.2 爬虫基本流程
- 发起请求: 使用http库向目标站点发起请求,即发送一个Request Request包含:请求头、请求体等
- 获取响应内容: 如果服务器能正常响应,则会得到一个Response Response包含:html,json,图片,视频等
- 解析内容: 解析html数据:正则表达式,第三方解析库如Beautifulsoup,pyquery等 => 解析json数据:json模块 解析二进制数据:以b的方式写入文件
- 保存数据: 数据库 / 文件
2.ProxyHandler处理器(代理):
-
代理的原理:在请求目的网站之前,先请求代理服务器,然后让代理服务器去请求目的网站,代理服务器拿到目的网站的数据后,再转发给我们的代码。
-
httpbin.org:这个网站可以方便的查看http请求的一些参数。
-
在代码中使用代理:
- 使用
urllib.request.ProxyHandler
,传入一个代理,这个代理是一个字典,字典的key依赖于代理服务器能够接收的类型,一般是http
或者https
,值是ip:port
。 - 使用上一步创建的
handler
,以及request.build_opener
创建一个opener
对象。 - 使用上一步创建的
opener
,调用open
函数,发起请求。 示例代码如下:
- 使用
from urllib import request
url = 'http://httpbin.org/ip'
# 1. 使用ProxyHandler,传入代理构建一个handler
handler = request.ProxyHandler({"http":"223.241.78.43:8010"})
# 2. 使用上面创建的handler构建一个opener
opener = request.build_opener(handler)
# 3. 使用opener去发送一个请求
resp = opener.open(url)
print(resp.read())
复制代码
3. requests请求
发送get请求:
发送get请求,直接调用requests.get
就可以了。想要发送什么类型的请求,就调用什么方法。
response = requests.get("https://www.baidu.com/")
复制代码
response的一些属性:
import requests
kw = {'wd':'中国'}
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36"}
# params 接收一个字典或者字符串的查询参数,字典类型自动转换为url编码,不需要urlencode()
response = requests.get("http://www.baidu.com/s", params = kw, headers = headers)
# 查看响应内容,response.text 返回的是Unicode格式的数据
print(response.text)
# 查看响应内容,response.content返回的字节流数据
print(response.content)
# 查看完整url地址
print(response.url)
# 查看响应头部字符编码
print(response.encoding)
# 查看响应码
print(response.status_code)
复制代码
response.text和response.content的区别:
- response.content:这个是直接从网络上面抓取的数据。没有经过任何解码。所以是一个bytes类型。其实在硬盘上和在网络上传输的字符串都是bytes类型。
- response.text:这个是str的数据类型,是requests库将response.content进行解码的字符串。解码需要指定一个编码方式,requests会根据自己的猜测来判断编码的方式。所以有时候可能会猜测错误,就会导致解码产生乱码。这时候就应该使用
response.content.decode('utf-8')
进行手动解码。
发送post请求:
发送post请求非常简单。直接调用requests.post
方法就可以了。 如果返回的是json数据。那么可以调用response.json()
来将json字符串转换为字典或者列表。
使用代理:
在请求方法中,传递proxies
参数就可以了。
处理cookie:
如果想要在多次请求中共享cookie。那么应该使用session。示例代码如下:
import requests
url = "http://www.renren.com/PLogin.do"
data = {"email":"970138074@qq.com",'password':"pythonspider"}
headers = {
'User-Agent': "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36"
}
session = requests.Session()
session.post(url,data=data,headers=headers)
response = session.get('http://www.renren.com/880151247/profile')
with open('renren.html','w',encoding='utf-8') as fp:
fp.write(response.text)
复制代码
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END