爬虫之requests模块相关
涂寐 Lv5

声明

本教程仅供学习参考,请勿用在非法途径上,违者后果自负,与笔者无关。 –涂寐

概念理解

  • python原生的基于网络请求的模块,用于模拟浏览器发起请求

配置环境

1
2
python -m pip install --upgrade pip	#更新pip
pip install requests #安装request模块

使用流程

  • 指定url
    • 伪造User-Agent
    • 处理请求参数
  • 发起请求
  • 获取响应数据
  • 持久化存储

项目实战

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 目的:爬取本人博客首页

# 导入requests模块
import requests

# “__name__”是Python的内置变量,用于指代当前模块
if __name__ == "__main__":
# 1、指定url
url = 'https://0xtlu.me/'
# 2、发起get请求,返回响应对象
# 注意请求方式:post or get
response = requests.get(url=url)
# 3、获取响应数据-->.text:字符串形式源码数据
page_text = response.text
print(page_text)
# 4、持久化存储
with open('./0xtlu.html', 'w', encoding='utf-8') as fp:
fp.write(page_text)
print('博客爬取完毕!!')

实战巩固

- 目的:爬取搜狗指定词条页面
    - UA检测:门户网站使用User-Agent进行身份认证,实现反爬机制
    - UA伪装:爬虫伪造UA,实现反反爬机制
- 目的:破解百度翻译
    - post请求:携带某些参数
    - 响应数据:json形式
- 目的:爬取豆瓣电影分类排行榜
- 目的:爬取肯德基各地餐厅查询
- 目的:爬取药监局生产许可信息
    - 循环爬取多页面
    - 提取具体某个数据

搜狗网页采集器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#!/usr/bin/python
# -*-coding:utf-8 -*-
# 以上两行说明
# 第一行,提示linux/Mac OS 此为python可执行程序,对Windows无效
# 第二行,提示Python解释器 按照UTF-8编码读取源代码

# 目标:爬取搜狗指定词条页面
# 导入requests模块
import requests

# "__name"为python内置变量,指代当前模块
if __name__ == "__main__":
# 6、UA伪装
# 将某个浏览器的User-Agent封装到字典中
# 在发起请求中通过headers参数进行篡改UA
# 字典键值对中值过长警告:PEP 8: E501 line too long (138 > 120 characters)
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.45 Safari/537.36'
}

# 1、指定url
# 删除非必要参数,缩短url
# url中不需要参数写入部分
url = 'https://www.sogou.com/web'

# 2、使用字典存储url中参数,方便动态使用
kw = input('Please enter the word:')
params = {
'query': kw
}

# 3、发起请求
# 通过params写入动态参数query
# 通过headers写入伪造UA
# 发起带参数的get请求
response = requests.get(url=url, params=params, headers=headers)

# 4、获取数据
page_text = response.text
print(page_text)

# 5、持久化存储
fileName = kw + '.html'
with open(fileName, 'w', encoding='utf-8') as fp:
fp.write(page_text)
print(fileName, '成功拉取')

爬取百度翻译

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#!/usr/bin/python
# -*-coding=utf-8-*-

# 爬取百度翻译
# 涉及网页局部刷新:ajax
# 看从哪个响应包获得数据:F12-->Network-->Fetch/XHR-->Headers或Payload-->Preview

# 需要的模块
import json
import requests

if __name__ == "__main__":
# 1、指定url
post_url = 'https://fanyi.baidu.com/sug'
# 2、ua伪装
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36 Edg/95.0.1020.44'
}
# 3、url参数处理
text = input('Please enter the word:')
data = {
'kw': text
}
# 4、发送post请求
response = requests.post(url=post_url, data=data, headers=headers)
# 5、获取数据-->json():响应类型需为json方可使用;返回类型为obj
dic_obj = response.json()
print(dic_obj)
# 6、持久化存储
# 不适用ascii编码(默认使用):ensure_ascii=False
fp = open('./'+text+'.json', 'w', encoding='utf-8')
json.dump(dic_obj, fp=fp, ensure_ascii=False)
fp.close()
print('成功翻译!!!')

爬取豆瓣电影信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#!/usr/bin/python
# -*-encoding=utf-8-*-
# 爬取豆瓣信息
# 持续加载界面(加载更多)
import json

import requests

if __name__ == "__main__":
# 1、指定URL
# 不同链接,参数不一样
url = 'https://movie.douban.com/j/chart/top_list'
# 2、ua伪造
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36 Edg/95.0.1020.44'
}
# 3、URL参数处理
param = {
'type': '11', # 分类
'interval_id': '100:80', # 优良率
'action': '',
'start': '0', # 从何开始
'limit': '20', # 是何范围
}
# 4、发起请求
# 注意请求方式,需与 Netword 中一致
response = requests.get(url=url, params=param, headers=headers)
list_data = response.json()
print(list_data)
# 5、持久性存储
fp = open('./douban.json', 'w', encoding='utf-8')
json.dump(list_data, fp=fp, ensure_ascii=False)
fp.close()
print('影视产品爬取完毕!!!')

爬取药监局生产许可信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#!/usr/bin/python
# -*-encoding=utf-8-*-
# 拉取国家药物管理局官网某化妆品许可证查公司
# http://scxk.nmpa.gov.cn:81/xk/
# 抓包发现 http://scxk.nmpa.gov.cn:81/xk/ 为ajax动态加载数据,罗列出各化妆品公司列表,内容涵括id属性
# 查看某公司化妆品生产许可证信息发现,仍是使用ajax请求加载:http://scxk.nmpa.gov.cn:81/xk/itownet/portal/dzpz.jsp?id=e0d91bbf627b45ca91051f70cef274ff
# 多次观察URL,可判断为通过id绑定公司化妆品生产许可证详细信息
# 现在问题,如何通过 http://scxk.nmpa.gov.cn:81/xk/ 中的公司列表,批量获取 http://scxk.nmpa.gov.cn:81/xk/itownet/portalAction.do?method=getXkzsById 中的详细信息
import requests
import json

if __name__ == "__main__":
# 拿个列表存储获取到的公司ID
id_list = []
# 拿个列表存储获取到的多个公司的详细信息
all_data_list = []
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36 Edg/95.0.1020.44'
}

# 循环爬取前5页id
url = 'http://scxk.nmpa.gov.cn:81/xk/itownet/portalAction.do?method=getXkzsList'
for page in range(1, 10):
page = str(page)
data = {
'on': 'true',
'page': page,
'pageSize': '15',
'productName': '',
'conditionType': '1',
'applyname': '',
'applysn': ''
}
# page_json = (requests.post(url=url, headers=headers, data=data)).json()
response = requests.post(url=url, headers=headers, data=data)
page_json = response.json()
# 为测试该界面获取到的信息 http://scxk.nmpa.gov.cn:81/xk/itownet/portalAction.do?method=getXkzsList
# print(page_json)
# 根据返回包中list属性,取出list列表中每个字典ID属性对应的值(列表嵌套字典)
for dic in page_json['list']:
# append()方法用于在列表末尾添加新的对象
id_list.append(dic['ID'])
# 循环获取所有公司具体信息
allUrl = 'http://scxk.nmpa.gov.cn:81/xk/itownet/portalAction.do?method=getXkzsById'
for allId in id_list:
idData = {
'id': allId
}
allResponse = requests.post(url=allUrl, headers=headers, data=idData)
page_allJson = allResponse.json()
# print(page_allJson)
all_data_list.append(page_allJson)
# print(all_data_list)
fp = open('./allData.json', 'w', encoding='utf-8')
json.dump(all_data_list, fp=fp, ensure_ascii=False)
print('列表枚举成功!!!')
 评论