Python爬虫(二)request模块

178 阅读5分钟

一:Python的requests模块:

Python中原生的一款基于网络请求的模块,功能强大,简单便捷,效率极高

作用:模拟浏览器发起网络请求。

 

二:使用

那我们应该如何使用requests模块呢?一共分以下几步:

1:指定请求的url

2:发起网络请求

3:获取响应数据

4:持久化存储(将结果保存下来)

 

三:环境配置

这里还是要废话一下,想要使用request模块,那么你的python环境中需要安装requests模块。

这里推荐使用anconda来管理python环境

Windows安装anconda请移步《Python(三)开源的Python包管理器 anaconda——window安装

Linux安装anconda请移步《Python(四)开源的Python包管理器 anaconda——linux安装

也可以使用命令安装:

Pip install requests

 

个人觉得,可能还是图形界面管理相对方便一点

111.png

 

四:小试牛刀

我这里尝试爬取一下搜狗搜索的数据,别问我为啥不爬百度,问就是没那个勇气

搜狗网址:www.sogou.com/

以下是我爬虫部分的代码:

#!/usr/bin/python3
# -*- coding: utf-8 -*-
# @Time    : 2022/2/14 17:29
# @Author  : camellia
# @Email   : 805795955@qq.com
# @File    : pachong.py
# @Software: PyCharm

# 引用request模块
import requests
# 1:指定url
url = "https://www.sogou.com/"
# 2:模拟网络请求链接
responce = requests.get(url=url)
# 3:获取响应数据
content = responce.text
# 4:持久化存储
print(content)
with open('./sougou.html','w',encoding='utf-8') as fe:
    fe.write(content)

 

爬取的数据我这里不做展示了,有兴趣可以使用上边的代码自己试一下

 

五:实例巩固

1:爬取搜狗指定词条的对应搜索结果页面(简易网页采集器)

代码参照上边的写,没什么难度

# 引用request模块
import requests
# 请求参数
query=''
# 1:指定url
url = 'https://www.sogou.com/web'
# 动态获取参数
info = input("请输入一个参数:")
param = {
    query: info
}
# 这里用到了 request.get的第二个参数params
# 2:模拟网络请求链接
responce = requests.get(url=url, params=param)
# 3:获取响应数据
content = responce.text
# 4:持久化存储
with open(info+'.html', 'w', encoding='utf-8') as fe:
    fe.write(content)
print('爬取完成!')

运行:得到如下的代码:(我这里只截取了一部分)

222.png

被检测到异常访问,要求输入验证码,那这个问题改如何解决呢?

这个我们首先需要理解一下网站的反扒机制:

UA:user-agent(请求载体的身份标识)

UA检测:门户网站的服务器会检测对应请求的载体身份标识,如果检测到请求的载体身份标识为某一款浏览器,则说明该请求是一个正常的请求,但是,如果检测到请求的再提身份不是基于某一款浏览器,则表示请求为不正常的请求(爬虫)

UA伪装:让爬虫对应的请求载体身份标识伪装成某一款浏览器

修改完后的代码如下所示:

# 引用request模块
import requests
# UA伪装 将对应的User-Agent封装到一个字典中(浏览器标识去浏览器中用f12查看源代码获取就好了)
headers={
    "User-Agent":'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36'
}
# 请求参数
query=''
# 1:指定url
# url = 'https://guanchao.site/pc/articleList'
url = 'https://www.sogou.com/web'
# 动态获取参数
info = input("请输入一个参数:")
param = {
    'query': info
}
# 这里用到了 request.get的第二个参数params
# 2:模拟网络请求链接
responce = requests.get(url=url, params=param, headers=headers)
# 3:获取响应数据
content = responce.text
# 4:持久化存储
with open(info+'.html', 'w', encoding='utf-8') as fe:
    fe.write(content)
    print('爬取完成!')

运行代码,搜索java,爬取到如下结果:我截取了部分页面

333.png

 

2:破解百度翻译(破解失败,百度的反爬是越来越严格了)

百度翻译请求的数据如下所示:

444.png

这里加入了反爬机制,我猜想可能是每次请求的cookie与参数中的sign或者token有什么关联,导致我们爬取失败,我这边的代码如下:

# 引用request模块
import requests
# 1:指定url
url = "https://fanyi.baidu.com/v2transapi?from=zh&to=en"
# 动态获取参数
info = input("请输入一个参数:")
# 2:UA伪装 将对应的User-Agent封装到一个字典中(浏览器标识去浏览器中用f12查看源代码获取就好了)
headers = {
    "User-Agent":'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.80 Safari/537.36 Edg/98.0.1108.43'
}
# 3:模拟网络请求链接
data = {
    'from''zh',
    'to''en',
    'query': info,
    'transtype''realtime',
    'sign'927392.705937,
}
responce = requests.post(url=url, data=data, headers=headers)
# 4:获取响应数据
content = responce.text
print(content)
# 5:持久化存储
with open('fanyi.html''w', encoding='utf-8'as fe:
    fe.write(content)
    print('爬取完成!')

 

运行代码,爬取的结果为:

{"errno":997,"errmsg":"未知错误","query":"水电费水电费","from":"zh","to":"en","error":997}

虽然爬取失败了,但是我尝试爬取百度翻译的本意就是爬取百度翻译接口请求数据的结果

说白了就是爬取json。

虽然没有爬到我们想要的数据,但是接口还是给我们返回了一个json。爬取接口数据的json就是这个样子的

 

3:爬取豆瓣电影分类排行榜 https://movie.douban.com中的电影详细数据

百度翻译爬取的不是很成功,这里尝试一下豆瓣的情况

代码如下:

#!/usr/bin/python3
# -*- coding: utf-8 -*-
# @Time    : 2022/2/14 17:29
# @Author  : camellia
# @Email   : 805795955@qq.com
# @File    : pachong.py
# @Software: PyCharm

# 引用request模块
import requests
# 1:指定url
url = "https://movie.douban.com/j/search_subjects"
# 2:UA伪装 将对应的User-Agent封装到一个字典中(浏览器标识去浏览器中用f12查看源代码获取就好了)
headers = {
    "User-Agent":'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.80 Safari/537.36 Edg/98.0.1108.43'
}
# 3:模拟网络请求链接
data = {
    'type''tv',
    'tag''热门',
    'sort''recommend',
    'page_limit'20,
    'page_start'40
}
responce = requests.get(url=url, params=data, headers=headers)
# 4:获取响应数据
content = responce.text
print(content)
# 5:持久化存储
with open('douban.html''w', encoding='utf-8'as fe:
    fe.write(content)
    print('爬取完成!')

爬取数据结果是一个json,数据太长,我这里就不做展示了。有兴趣的可以自己尝试一下

 

爬取他人网站数据这个情况是这个样子的,有的网站让你爬取,有的网站不让你爬取,让你爬的消停爬取就好了,不让你爬,你还非要爬的,可能是要费点时间好好研究一下,最后能不能成还不知道。

 

有好的建议,请在下方输入你的评论。

欢迎访问个人博客 guanchao.site