在python实现的网络爬虫中,用于网络请求发送的模块有两种,第一种为urllib模块,第二种为requests模块。urllib模块是一种比较古老的模块,在使用的过程中较为繁琐和不便。当requests模块出现后,就快速的代替了urllib模块,因此,在我们课程中,推荐大家使用requests模块。
requests模块是python中原生的基于网络请求的模块,功能强大,用法简洁高效。在爬虫领域中占据着半壁江山的地位。
作用:模拟浏览器发起请求。
pip install requests
1、指定url
2、基于requests模块发起请求
3、获取响应对象中的数据值
4、持久化存储
#导包
import requests
#step_1:指定url
url = 'https://www.baidu.com/'
#step_2:发起请求:使用get方法发起get请求,该方法会返回一个响应对象。参数url表示请求对应的url
response = requests.get(url=url)
#step_3:获取响应数据:通过调用响应对象的text属性,返回响应对象中存储的字符串形式的响应数据(页面源码数据)
page_text = response.text
#step_4:持久化存储
with open('./baidu.html','w',encoding='utf-8') as fp:
fp.write(page_text)
print('爬取数据完毕!!!')
User-Agent:请求载体的身份标识,使用浏览器发起的请求,请求载体的身份标识为浏览器,使用爬虫程序发起的请求,请求载体为爬虫程序。
UA检测:相关的门户网站通过检测请求该网站的载体身份来辨别该请求是否为爬虫程序,如果是,则网站数据请求失败。因为正常用户对网站发起的请求的载体一定是基于某一款浏览器,如果网站检测到某一请求载体身份标识不是基于浏览器的,则让其请求失败。因此,UA检测是我们整个课程中遇到的第二种反爬机制,第一种是robots协议。
UA伪装:通过修改/伪装爬虫请求的User-Agent来破解UA检测这种反爬机制,具体实现见下属代码:
import requests
# 指定url,原始url可能是https://www.sogou.com/web?query=番茄,发现该url携带了参数
url = 'https://www.sogou.com/web'
# 指定搜索关键字
kw = input('enter word:')
param = {
'query': kw,
}
# 自定义请求头信息:UA伪装,将包含了User-Agent的字典作用到请求方法的headers参数中即可
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.129 Safari/537.36',
}
# 发起请求
response = requests.get(url, params=param, headers=headers)
# 获取响应数据
page_text = response.text
# 持久化存储
file_name = kw + '.html'
with open(file_name, 'w', encoding='utf-8') as fp:
fp.write(page_text)
print('爬取数据结束!!!')
import requests
import json
# 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/81.0.4044.129 Safari/537.36',
}
# 3. 处理post请求数据
word = input('enter a word:')
data = {
'kw': word,
}
# 4. 发起请求
response = requests.post(post_url, data=data, headers=headers)
# 5. 获取响应数据:如果响应回来的数据为json,则可以直接调用响应对象的json方法获取json对象数据
json_data = response.json()
# 6. 数据持久化处理
fileName = word + '.json'
fp = open(fileName, 'w', encoding='utf-8')
json.dump(json_data, fp, ensure_ascii=False)
print('over!!!')
import requests
import json
# 确定url
url = 'https://movie.douban.com/j/chart/top_list?'
# 请求参数处理
param = {
'type': '5',
'interval_id': '100:90',
'action': '',
'start': '0',
'limit': '20'
}
# UA伪装
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36',
}
# 发起请求
response = requests.get(url=url, params=param, headers=headers)
# 数据持久化处理
list_data = response.json()
fp = open('./douban.json', 'w', encoding='utf-8')
json.dump(list_data, fp=fp, ensure_ascii=False)
print('over!!!!')
# _author: 17393
# date: 2020/9/2
import requests
import json
if __name__ == '__main__':
# 确定url
url = 'http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=keyword'
# 处理请求参数
cityName = input("请输入城市名称:")
data = {
'cname': '',
'pid': '',
'keyword': cityName,
'pageIndex': '1',
'pageSize': '10',
}
# UA伪装
header = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.129 Safari/537.36',
}
# 发起请求
response = requests.post(url=url, data=data, headers=header)
# 数据持久化处理
data_text = response.text
file = cityName + '.txt'
with open(file, 'w', encoding='utf-8') as fp:
fp.write(data_text)
print('over!!!')
import requests
import json
if __name__ == '__main__':
# 批量获取不同企业的id值
url = 'http://scxk.nmpa.gov.cn:81/xk/itownet/portalAction.do?method=getXkzsList'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.129 Safari/537.36',
}
id_list = [] # 存放所有企业的id
all_data_list = [] # 存放所有企业的信息
# 参数封装
for page in range(1, 3):
data = {
'on': 'true',
'page': str(page),
'pageSize': 15,
'productName': '',
'conditionType': 1,
'applyname': '',
'applysn': '',
}
json_text = requests.post(url=url, headers=headers, data=data).json()
for dict in json_text['list']:
id_list.append(dict['ID'])
post_url = 'http://scxk.nmpa.gov.cn:81/xk/itownet/portalAction.do?method=getXkzsById'
for id in id_list:
data = {
'id': id,
}
detail_json = requests.post(url=url, headers=headers, data=data).json()
all_data_list.append(detail_json)
fp = open('./allData.json', 'w', encoding='utf-8')
json.dump(all_data_list, fp=fp, ensure_ascii=False)
print('over!!!')