Python爬虫(1)

一:Requests的使用介绍

1. Requests的使用

Requests库是一个用于模拟发送网络请求并获取服务器响应数据的第三方库。它是用Python语言编写,基于urllib库,但比 urllib更加简单、方便和人性化。通过requests库可以帮助我们实现自动爬取HTML网页页面以及模拟人类访问服务器自动提交网络请求。(了解)

安装requests库

pip install requests

更换python的镜像源

在使用命令安装第三方库的时候,因为默认的下载镜像源在国外,会导致下载速度很慢,甚至因为网络中断而导致下载失败。所以我们需要将下载第三方包的镜像源更换为国内的,以此来保证第三方库的下载速度。
在 Windows 系统中打开 CMD 终端,然后输入如下命令:

pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple

(这里我们用的是清华大学的)

requests库的基本使用

import requests
# 定义目标url的字符串
url = 'https://www.baidu.com'
# 向目标url发送get请求, 然后获取响应对象。
response = requests.get(url)
# 将响应内容以文本的方式进行打印(自动推断编码格式)
print(response.text)
# 如果出现乱码,可以通过指定编码格式来解码
response.encoding = 'utf-8'
# 打印指定了解码方式的字符出数据
print(response.text)

(url就是你想访问的目标网址)

2.Response的属性

requests模块发送简单的get请求、获取响应
需求:通过requests向百度首页发送请求,获取百度首页的数据

import requests
# 目标url
url = 'https://www.baidu.com'
# 向目标url发送get请求
response = requests.get(url)
# 打印响应内容
print(response.text)

response的属性:
response.text 响应体 str类型
respones.content 响应体 bytes类型
response.status_code 响应状态码
response.request.headers 响应对应的请求头
response.headers 响应头
response.request._cookies 响应对应请求的cookie
response.cookies 响应的cookie(经过了set-cookie动作)

编码问题的解决方式:(爬取结果有乱码如何解决)
1.response.text
类型:str
解码类型: requests模块自动根据HTTP头部对响应的编码作出有根据的推测,推测的文本编码
如何修改编码方式: response.encoding=“gbk”

2.response.content
类型:bytes
解码类型: 没有指定
如何修改编码方式: response.content.decode(“utf-8”)
~~

至于到底用哪种编码格式去打印,取决于网站本身(建议按F12查看),并非所有的网站都是“utf-8”

~~
获取网页源码的通用方式:

  1. response.content.decode() 不填编码状态的话默认为“utf-8”
  2. response.content.decode(“GBK”)
  3. response.text
    以上三种方法从前往后尝试,能够100%的解决所有网页解码的问题
    所以:更推荐使用 response.content.decode() 的方式获取响应的html页面

3.响应数据的保存

保存网页信息:html数据保存

import requests
# 网页的URL链接
url = 'https://www.baidu.com'
# 向目标发送请求,并获取响应
response = requests.get(url)
# print(response.text)
# 以字符串的方式写入html文件中
with open('baidu.html', 'w', encoding='utf-8') as file:
# 将数据以字符串的形式写入
file.write(response.text)
# 以二进制的方式写入html文件中, 以二进制方式写入不需要指定编码
with open('baidu.html','wb') as file:
# 将数据以字节的形式写入
file.write(response.content)

保存图片信息:把网络上的图片保存到本地

import requests
# 图片的url
url = 'https://www.baidu.com/img/bd_logo1.png'
# 响应本身就是一个图片,并且是二进制类型
response = requests.get(url)
# 以二进制的方式写入文件中, 一般用于下载图片、音频、视频等各种文件
with open('baidu.jpg','wb') as file:
# 将数据以字节的形式写入
file.write(response.content)

4.User-agent介绍

User Agent中文名为用户代理,简称 UA,它是一个特殊的键值对数据,可以让服务器能够识别客户使
用的操作系统及版本、浏览器及版本、浏览器渲染引擎、浏览器语言等,简单来说就像是当前用户的简
易身份证信息

我们先写一个获取百度首页的代码

import requests
url = 'https://www.baidu.com'
response = requests.get(url)
print(response.content)
# 打印响应对应请求的请求头信息
print(response.request.headers)

思考:
对比浏览器上百度首页的网页源码和代码中的百度首页的源码,有什么不同?
代码中的百度首页的源码非常少,为什么?
为什么请求需要带上headers?
模拟浏览器,欺骗服务器,获取和浏览器一致的内容
headers的形式:字典

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"}

完整的代码

import requests
url = 'https://www.baidu.com'
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"}
# 在请求头中带上User-Agent,模拟浏览器发送请求
response = requests.get(url, headers=headers)
# print(response.content)
# 打印请求头信息
print(response.request.headers)

User-Agent代理池
在编写爬虫程序是为了防止被服务器检测为爬虫程序,一般都会在请求头中设置用户代理信息。但是如果短时间内高频率的访问网站服务器,就有可能会引起网站服务器的注意,从而封禁 IP 地址来阻止爬虫
基于这种情况,我们可以使用 User-Agent 代理池来避免这类问题。User-Agent 代理池也被称为用户代理池,主要是通过多个用户代理数据轮换使用来防止被服务器检测为爬虫程序
了解了用户代理池的重要性后,就可以开始自建用户代理池了。因为用户代理本质上是一个键值对数据,而且键的名称是固定的,所以只需要设置对应的值就好了
那么自建用户代理池就非常的简单,只需要定义一个列表数据,然后将不同的用户代理数据存放在列表中。当要设置用户代理时就通过 random 模块随机取出列表中的一个用户代理数据。只要用户代理数据多一些,就不会出现同一个用户代理频繁访问被封禁的情况了
相较于自建用户代理池来说,我们也可以使用 Fake-UserAgent 库来自动获取定义好的用户代理池,这样可以免于收集用户代理信息
Fake-UserAgent 库是一个第三方库,需要单独安装才可以使用
安装命令如下:

pip install fake_useragent

使用用户代理池的代码

import requests
from fake_useragent import FakeUserAgent
# 实例化一个用户代理数据
user_agent_demo = FakeUserAgent().random
print(user_agent_demo)
headers = {'User-Agent': user_agent_demo}
url = 'http://www.baidu.com'
response = requests.get(url, headers=headers)
print(response.text)

根据以上所学优化后的代码:

'''写爬虫的任何代码都要放在英文的路径下,中文路径会报错'''
'''python解释器所在的路径也不可以带有中文(where python查看)'''

import requests
from fake_useragent import FakeUserAgent

'''选取目标网站'''
url = 'https://www.baidu.com/'

'''买个假的身份证,每次都不一样'''
key = FakeUserAgent().random

'''定义请求头字典,生成用户代理'''
headers = {'User-Agent': key} # 这个‘User-Agent’是固定写法

'''发送请求'''
response = requests.get(url,headers=headers)

'''查看所获得的内容两种方式'''
response.encoding = 'utf-8'
print(response)# Response 200 此处为查看响应状态
print(response.text)

response.content.decode('utf-8')
print(response.content)

'''以文件形式创造两种方式'''
with open('../baidu.html', 'w', encoding ='utf-8') as file:
    file.write(response.text)

with open('../baidu01.html', 'wb') as file:
    file.write(response.content)

希望本篇文章对你有帮助

  • 21
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值