Python爬虫常用库requests

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()

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值