Request模块
request模块基本使用
import request
url = “http://www.baidu.com”
response = request.get(url)
#获取响应URL
print(response.url)
#获取响应状态码
print(response.status_code)
#获取请求头以及响应头信息,返回字典
print(response.request.headers)
print(response.headers)
#获取请求中携带的cookie数据 类型RequestsCookieJar
print(response.request._cookies)
#获取响应中cookie,类型RequestsCookieJar
print(response.cookies)
————————————————
版权声明:本文为CSDN博主「绪风750」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/fanicinc/article/details/121754811
response.text和response.content区别
1,response.text返回的类型是str,可能导致乱码encoding=‘utf-8’修改编码格式
2,response.content返回bytes类型,response.content.decode()bytes类型变为str类型,默认utf-8
练习 百度贴吧抓取
"""
分析:
第一页的url: https://tieba.baidu.com/f?ie=utf-8&kw=李毅&pn=0
第二页: https://tieba.baidu.com/f?kw=李毅&ie=utf-8&pn=50
第三页: https://tieba.baidu.com/f?kw=李毅&ie=utf-8&pn=100
第四页: https://tieba.baidu.com/f?kw=李毅&ie=utf-8&pn=150
先构造出来 10 个url地址: https://tieba.baidu.com/f?ie=utf-8&kw=李毅&pn=
遍历10个url地址 分别去发送请求 获取响应 保存响应内容即可,
"""
import requests
import time
class TieBaSpider(object):
def __init__(self, tieba_name, page):
# 初始化url地址,
self.tb_name = tieba_name
self.base_url = "https://tieba.baidu.com/f?ie=utf-8&kw={}&pn={}"
self.url_list = [self.base_url.format(self.tb_name,i * 50) for i in range(page)]
def send_request(self, url):
# 发送请求 获取响应的方法
response = requests.get(url)
return response.content.decode()
def parse_data(self):
# 解析数据的方法
pass
def save_data(self, content, page_num):
# 保存数据
file_name = f"{self.tb_name}_第{page_num}页.html"
with open(file_name, "w", encoding='utf-8') as f:
f.write(content)
print(file_name, "----> 保存完毕")
def start(self):
# 遍历 每一个url地址 去发送请求获取响应
for url in self.url_list:
time.sleep(1)
# 发送请求 获取响应
html_str = self.send_request(url)
# 获取一下 当前的url地址再列表中的下标
page_num = self.url_list.index(url) + 1
self.save_data(html_str, page_num)
if __name__ == '__main__':
tb_name = input("请求输入要抓取的贴吧的名字:")
page = int(input("请求输入要抓取的贴吧的页数:"))
tieba = TieBaSpider(tb_name, page)
tieba.start( )
————————————————
版权声明:本文为CSDN博主「绪风750」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/fanicinc/article/details/121754620
发送带header参数的请求,代理IP,处理cookie
import requests
# url
url = "https://www.baidu.com/s?wd=python"
# 准备headers
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.77 Safari/537.36"
}
params = {
"wd": "python"
}
# 准备代理IP的字典
proxies = {
"http": "http://60.7.162.232:9999"
}
#从浏览器中复制来的登录之后的cookie
cookies_str = '复制过来的登录之后的cookie字符串'
# 将cookie字符串转换成 cookie字典
cookies_dict = {cookie.split('=')[0]: cookie.split('=')[1] for cookie in cookies_str.split('; ')}
response = requests.get(url, headers=headers,cookie = cookies_dict,params=params,proxies=proxies)
# 将响应的数据保存到文件中
with open("python.html", 'w', encoding='utf-8') as f:
f.write(response.content.decode())
————————————————
版权声明:本文为CSDN博主「绪风750」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/fanicinc/article/details/121754811
request模块其他使用
import requests
from retrying import retry
# 使用装饰器的方式,装饰函数,可以让被装饰的函数重复的去执行几次
@retry(stop_max_attempt_number=3)
def send_request():
print('-' * 20)
url = "http://www.google.com"
#timeout,3s内返回响应,否则抛出异常,verify = True,忽略安全证书
response = requests.get(url, timeout=3,verify=True)
return response
try:
response = send_request()
except Exception as e:
print('请求失败。。。。。')
else:
print(response.status_code)
练习: 金色财经抓取
url地址的中的参数:
参数是写死的。
网页的响应中。
url地址的响应中,
发送额外的ajax请求去获取参数。
金色财经案例:当前url地址响应中的数据,包含了下一次请求的url地址中的参数。
实现步骤:
第一次请求,直接发送第一页的url地址即可
拿到第一页的响应之后,解析数据,以及去解析下一页url地址所需的id值
拿到数据之后保存,拿到id之后,使用id将下一页的url构造出来
具体实现
import time
import requests
from pprint import pprint
class Spider(object):
def __init__(self):
self.start_url = "https://api.jinse.com/v6/www/information/list?catelogue_key=%E7%8B%AC%E5%AE%B6&information_id=1875641&flag=down"
self.base_url = "https://api.jinse.com/v6/www/information/list?catelogue_key=%E7%8B%AC%E5%AE%B6&information_id={}&flag=down"
self.headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.77 Safari/537.36"
}
def send_request(self, url):
response = requests.get(url, headers=self.headers)
print('正在抓取--->', response.url)
# 响应数据是 json数据,可以直接使用 response.json() 方法将 json字符串直接转换成 dict
return response.json()
def parse_data(self, data):
# 解析数据
news_list = data.get("list")
# 遍历每一个新闻,获取对应的数据
data_list = []
for new in news_list:
item = {}
item['title'] = new.get('title')
item['summary'] = new.get('extra').get("summary")
item['author'] = new.get('extra').get("author")
item['topic_url'] = new.get('extra').get("topic_url")
data_list.append(item)
# if len(news_list) == 20:
# # 解析出来下一页的id
# bottom_id = data.get("bottom_id")
# else:
# bottom_id = None
bottom_id = data.get('bottom_id') if len(news_list) == 20 else None
return data_list, bottom_id
def save_data(self, data_list):
with open('jinse.json', 'a', encoding='utf-8') as f:
f.write(str(data_list))
def start(self):
while True:
time.sleep(2)
# 1. 发送请求 获取响应
data = self.send_request(self.start_url)
# 2. 解析数据
data_list, bottom_id = self.parse_data(data)
print('bottom_id--->', bottom_id)
# 3. 保存数据
self.save_data(data_list)
# 根据bottom_id 将下一页的url地址构造出来,
self.start_url = self.base_url.format(bottom_id)
# 结束条件: 1. 翻到最后一页 可能 响应中 bottom_id = None
# 2. 根据每页的数据长度,如果长度不够20 就说明到了最后一页
if __name__ == '__main__':
spider = Spider()
spider.start()