文章目录
二、爬虫requests库
1.发送简单的请求
# 访问指定网址
response = requests.get(url)
# response的常用方法:
response.text
response.content
response.status_code
response.request.headers
response.headers
2.判断请求是否成功
# 判断请求是否成功
assert response.status_code == 200
3.发送带header的请求
为什么请求需要带上header?
因此需要模拟浏览器,欺骗服务器,获取和浏览器一致的内容
- header的形式:字典
- headers = {“User-Agent”: “Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.102 Safari/537.36”}
- 用法:requests.get(url, headers=headers)
什么叫做请求参数?
例1:http://www.webkaka.com/tutorial/server/2015/021013
例2:https://www.baidu.com./s?wd=python&c=b
- 参数的形式:字典
- kw={“wd” : “python”}
- 用法:requests.get(url, params=kw)
4.发送post请求
哪些地方我们会用到post请求:
- 登录注册(post比get更安全)
- 需要传输大文本内容的时候(psot请求对数据长度没有要求)
所以,我们的爬虫也需要在这两个地方回去模拟浏览器发送post请求
用法:
response = request.post(“http://www.baidu.com/”, data = data, headers=headers)
data的形式:字典
5.使用代理
用法:requests.get(“http://www.baidu.com”, proxies=proxies)
proxies的形式:字典
proxies={
“http:” “http://12.34.56.79:9527”,
“https:” “http://12.34.56.79:9527”,
}
使用代理ip前,需要检查ip的可用性
-
准备大量的ip地址,组成ip池,随机选择一个ip来用
-
如何随机选择代理ip,目的是让使用次数较少的ip地址,有更大的可能性被用到
- 将每个ip地址转化成字典,如{“ip”:ip, “times”:0}
- [{}, {}, {}, {}],对这个ip的列表进行排序,按照使用次数进行排序
- 选择使用次数较少的10个ip,从中随机选择一个
-
可以使用requests添加超时参数,判断ip地址的质量;
-
在线代理ip质量检测的网站;
6.cookie和session的区别
- cookie数据存放在客户的浏览器上,session数据存放在服务器上;
- cookie不是很安全,别人可以分析存放在本地的cookie并进行cookie欺骗;
- session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能;
- 单个cookie保存的数据不能超过4k,很多浏览器都限制一个站点最多保存20个cookies;
带上cookie、session的好处:
能够请求到登录之后的页面;
带上cookie、session的弊端:
一套cookie和session往往和一个用户对应,请求太快,请求次数太多,容易被服务器识别为爬虫;
因此,不要cookie的时候尽量不去使用cookie,但为了获取登录之后的页面,我们必须发送带有cookies的请求。
携带cookie请求
- 携带一堆cookie进行请求,把cookie组成cookie池;
7.处理cookies、session请求
requests提供了一个叫做session类,来实现客户端和服务端的会话保持(session能够保证客户端存在本地的cookie)
- 使用方法:
- 1.实例话一个session对象
- session = requests.session()
- 2.让session发送get或者post请求
- response = session.get(url,headers)
- 1.实例话一个session对象
使用requests提供的session类来请求登录之后的网站的思路
- 实例化session;
- 先使用session发送请求,登录对网站,把cookie保存在session中;
- 再使用session请求登录之后才能访问的网站,session能够自动的携带登录成功的时保存在其中的cookie,进行请求;
# 方式一:实例化session,使用session发送post请求,在使用他获取登录后的页面
session = requests.session()
post_url = "http://www.renren.com/SysHome.do"
post_data = {"email": "gaokaoenglish150@sina.com", "password": "*******"}
headers = {
"user-agent": "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.102 Mobile Safari/537.36"}
# 使用session发送post请求,cookie保存在其中
session.post(post_url, data=post_data, headers=headers)
# 再使用session进行请求登录之后才能访问的地址
r = session.get("http://www.renren.com/239835519/newsfeed/photo", headers=headers)
# 保存页面
with open("05.renren.html", mode="w", encoding="utf-8") as f:
f.write(r.content.decode())
# 方式二:headers中添加cookie键,值为cookie字符串
post_url = "http://www.renren.com/239835519/profile"
headers = {
"user-agent": "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.102 Mobile Safari/537.36",
"Cookie": "anonymid=kc7jw6xa8tig6d; depovince=ZGQT; _r01_=1; JSESSIONID=abcHfs-EegOYk4zqKRRsx; taihe_bi_sdk_uid=3fc202011b1d380a3967c595de815f9e; taihe_bi_sdk_session=669440f8e13e6d063fc46ee65e17b425; ick_login=fdcab00f-eb6a-4458-a10d-a2c737ab0f85; first_login_flag=1; ln_uact=gaokaoenglish150@sina.com; ln_hurl=http://hdn.xnimg.cn/photos/hdn301/20081231/14/15/main_o7qe_10709k204096.jpg; wp_fold=0; jebecookies=35667259-2fce-4b7e-b9a0-ec4fc7ad7cb4|||||; _de=15F0BF98A509B5DBE4B3DE76E4D44457270E2E3B4A0CA0A66DEBB8C2103DE356; p=633d5bfbf82fa4ba51e0ea7584b725ba9; t=807a936192f54fa3dfe515d65ec3f2b99; societyguester=807a936192f54fa3dfe515d65ec3f2b99; id=********; xnsid=5442fbef; ver=7.0; loginfrom=null"
}
r = requests.get("http://www.renren.com/239835519/newsfeed/photo", headers=headers)
# 保存页面
with open("05.renren.html", mode="w", encoding="utf-8") as f:
f.write(r.content.decode())
# 方式三:在请求方法中添加cookies参数,接受字典形式的cookie。字典形式的cookies中的键是cookie的name,值是cookie的value
headers = {
"user-agent": "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.102 Mobile Safari/537.36"}
url = "http://www.renren.com/239835519/profile"
cookies = "anonymid=kc7jw6xa8tig6d; depovince=ZGQT; _r01_=1; JSESSIONID=abcHfs-EegOYk4zqKRRsx; taihe_bi_sdk_uid=3fc202011b1d380a3967c595de815f9e; taihe_bi_sdk_session=669440f8e13e6d063fc46ee65e17b425; ick_login=fdcab00f-eb6a-4458-a10d-a2c737ab0f85; first_login_flag=1; ln_uact=gaokaoenglish150@sina.com; ln_hurl=http://hdn.xnimg.cn/photos/hdn301/20081231/14/15/main_o7qe_10709k204096.jpg; wp_fold=0; jebecookies=35667259-2fce-4b7e-b9a0-ec4fc7ad7cb4|||||; _de=15F0BF98A509B5DBE4B3DE76E4D44457270E2E3B4A0CA0A66DEBB8C2103DE356; p=633d5bfbf82fa4ba51e0ea7584b725ba9; t=807a936192f54fa3dfe515d65ec3f2b99; societyguester=807a936192f54fa3dfe515d65ec3f2b99; id=********; xnsid=5442fbef; ver=7.0; loginfrom=null"
# 字典推导式
cookies = {i.split("=")[0]: i.split("=")[1] for i in cookies.split("; ")}
r = requests.get(url, headers=headers, cookies=cookies)
# 保存页面
with open("05.renren.html", mode="w", encoding="utf-8") as f:
f.write(r.content.decode())
不发送post请求,使用cookie获取登录后的页面
- cookie过期时间很长的网站,如政府网站,学校网站等;
- 在cookie过期之前能够拿到所有的数据,比较麻烦;
- 配合其他程序一起使用,其他程序专门获取cookie,当前程序专门请求页面;
8.requests中解决编码的方法
response.text
- 类型:str
- 解码类型:根据HTTP头部对响应的编码做出有根据的推测,推测的文本编码
- 如何修改编码方式:response.encoding=“gbk”
response.content
-
类型:bytes
-
解码类型:没有指定
-
如何修改编码方式:response.content.decode(“utf-8”)
- response.content.decode();
- response.content.decode(“gbk”);
9.贴吧爬虫练习
import requests
class TiebaSpider:
def __init__(self, tieba_name):
self.tieba_name = tieba_name
self.headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.102 Safari/537.36"}
self.url_temp = "https://tieba.baidu.com/f?kw=" + tieba_name + "&ie=utf-8&pn={}"
# 1.构造url列表
def get_url_list(self):
# url_list = []
# for i in range(1000):
# url_list.append(self.url_temp.format(i * 50))
# return url_list
return [self.url_temp.format(i * 50) for i in range(1000)]
# 2.发送请求,获取响应
def parse_url(self, url):
print(url)
reponse = requests.get(url, headers=self.headers)
return reponse.content.decode()
# 3.保存html字符串
def save_html(self, html_str, page_num):
file_path = "{}-第{}页.html".format(self.tieba_name, page_num)
with open(file_path, mode="w", encoding="utf-8") as f:
f.write(html_str)
# 实现主要逻辑:不写具体的实现,只调用方法
def run(self):
# 1.构造url列表
url_list = self.get_url_list()
# 2.遍历,发送请求,获取响应
for url in url_list:
html_str = self.parse_url(url)
# 3.保存
page_num = url_list.index(url) + 1
self.save_html(html_str, page_num)
if __name__ == "__main__":
tieba_spider = TiebaSpider("恐怖漫画")
tieba_spider.run()