Resquests库应该是大多数爬虫初学者接触到的第一个库,因为他够简洁,而且功能对于常规的网页内容也够用。更好的是,它有中文文档,对我们这种四六级飘过的选手很友好,找机会整理了一下。
一、理论知识
1、导入requests模块:
import requests
2、requests.get()——最简单的请求:
r = requests.get('https://www.jianshu.com/')
3、requests.post():
用来给网页传递一个表单,主要用来进行登陆操作
r = requests.post('http://httpbin.org/post', data = {'key':'value'})
4、传递参数:
parmas参数
- 直接传输:
response = requests.get("http://httpbin.org/get?name=zhangsan&age=22")
print(response.text)
- 通过字典传输:
payload = {'key1': 'value1', 'key2': 'value2'}
response = requests.get("http://httpbin.org/get", params=payload)
print(response.text)
headers参数(请求头)
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36"
}
response = requests.get("http://httpbin.org/get", headers=headers)
print(response.text)
5、Proxies(代理)
proxies = {
"http": "https://175.44.148.176:9000",
"https": "https://183.129.207.86:14002"
}
response = requests.get("https://www.baidu.com/", proxies=proxies)
6、Response的一些属性
属性 | 描述 |
---|---|
response.text | 获取str类型(Unicode编码)的响应 |
response.content | 获取bytes类型的响应 |
response.status_code | 获取响应状态码 |
response.headers | 获取响应头 |
response.request | 获取响应对应的请求 |
7、cookies
cookie信息
response.cookies
session
session用来记录登陆状态,第一次用session发送post登陆请求后,请求头信息、登陆成功的cookies信息等都保存在session对象中,第二次只需要直接get即可。同时也可验证是否登录成功。
def login_renren():
login_url = 'http://www.renren.com/SysHome.do'
login_data = {"email": "账号","password": "密码"}
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36",}
session = requests.session()
response = session.post(login_url, data=login_data, headers=headers)
response = session.get("http://www.renren.com/971909762/newsfeed/photo")
print(response.text)
login_renren()
二、实例
1、百度贴吧请求:
import requests
import sys
class BaiduTieBa:
def __init__(self, name, pn, ):
self.name = name
self.url = "http://tieba.baidu.com/f?kw={}&ie=utf-8&pn=".format(name)
self.headers = {
# "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36"
# 使用较老版本的请求头,该浏览器不支持js
"User-Agent": "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)"
}
self.url_list = [self.url + str(pn * 50) for pn in range(pn)]
print(self.url_list)
def run(self):
for url in self.url_list:
data = self.get_data(url)
num = self.url_list.index(url)
self.save_data(data, num)
def get_data(self, url):
response = requests.get(url, headers=self.headers)
return response.content
def save_data(self, data, num):
file_name = self.name + "_" + str(num) + ".html"
with open(file_name, "wb") as f:
f.write(data)
if __name__ == '__main__':
name = sys.argv[1]
pn = int(sys.argv[2])
baidu = BaiduTieBa(name, pn)
baidu.run()
- if __name__ == '__main__':的作用:
一个python文件通常有两种使用方法,第一是作为脚本直接执行,第二是 import 到其他的 python 脚本中被调用(模块重用)执行。因此 if name == 'main': 的作用就是控制这两种情况执行代码的过程,在 if name == 'main': 下的代码只有在第一种情况下(即文件作为脚本直接执行)才会被执行,而 import 到其他脚本中是不会被执行的。 - sys.argv[n]:用于获取命令行输入的参数,sys.argv[0]为baidu.py文件的绝对路径,sys.argv[1]为第一个输入的参数,以此类推。注意,得到的是一个字符串对象。
- str1.format(str2):将str2填入str1的{}中
- list.index(str):输出str在list中的位置
- response.content:以byte类型输出
- open(file_name, "wb"):以byte类型写入
注:参考文章的这个例子感觉有点问题,"http://tieba.baidu.com/f?kw={}&ie=utf-8&pn={}".format(name,pn),感觉不应该此时传输pn,修改后可以跑通了。
baidu.py文件写好后,在项目目录打开CMD,输入:python baidu.py 两会 6
,得到结果。
2、人人网模拟登陆
session记录登录信息和cookie,接着访问个人主页,将结果保存到renren.html文件
import json
import requests
def login_renren():
login_url = 'http://www.renren.com/PLogin.do'
login_data = {"email": "账号","password": "密码"}
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36",}
session = requests.session()
session.post(login_url, data=login_data, headers=headers)
response = session.get("http://www.renren.com/581249666/newsfeed/photo")
with open('renren.html', 'wb') as fp:
fp.write(response.content)
cookies_dict = requests.utils.dict_from_cookiejar(response.cookies)
with open('cookies.txt', 'w') as f:
json.dump(cookies_dict,f)
with open('cookies.txt', 'r') as f:
cookies = json.load(f)
print(cookies)
login_renren()
网友评论