写在前言
爬虫简介
协议以及相关信息
requests模块
实战案例
如果需求可访问GitHub查看源项目:PythonRetiple
import requests
# UA伪装
# User-Agent:请求载体的身份标识
# UA伪装:门户网站的服务器会检测对应请求的载体身份标识,如果检测到某一载体身份标识为浏览器
# 说明请求为一个正常的请求,如果检测到请求的载体身份标识不是基于一款浏览器,则表示为不正常请求,服务器端可能会拒绝请求
# 即要建立UA伪装:让爬虫对应的请求载体身份标识伪装为一筐浏览器
# UA检测:反爬策略
# UA伪装:反反爬机制
if __name__ == "__main__":
# UA伪装:将对应的User-Agent封装到一个字典中
headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36'
}
#1、指定url
url = 'https://www.baidu.com/s'
#2、处理url所携带的参数,封装到字典中
kw = input('enter a word:')
param = {
'wd':kw
}
#2、对指定的url发起请求,对应的url是携带参数的,且请求过程中处理了参数
response = requests.get(url=url, params=param, headers=headers)
page_text = response.text
fileName = kw + '.html'
with open(fileName, 'w', encoding='utf-8') as fp:
fp.write(page_text)
print(fileName, '保存成功!!!')
import requests
import json
if __name__ == "__main__":
# 1、指定URL,注意这里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/86.0.4240.198 Safari/537.36'
}
#3、 post请求参数处理(同get一样)
word = input('enter a word:')
data = {
'kw':word
}
# 4、发起请求
response = requests.post(url=post_url, data=data, headers=headers)
# 5、获取响应数据(这里注意响应数据是json格式,json()返回的是obj,如果确认响应数据时json类型的才可以用 )
dic_obj = response.json()
# 6、持久化存储
fileName = word + '.json'
fp = open(fileName, 'w', encoding='utf-8')
# 因为拿到json字符串中有中文,中文不能使用ACSII编码
json.dump(dic_obj, fp=fp, ensure_ascii=False)
print('over!!!')
import requests
import json
if __name__ == "__main__":
url = 'https://movie.douban.com/j/chart/top_list'
param = {
'type':'24',
'interval_id':'100:90',
'action':' ',
'start':'0',
'limit':'20'
}
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36'
}
response = requests.get(url=url, params=param, headers=headers)
list_data = response.json()
fp = open('./电影.json', 'w', encoding='utf-8')
json.dump(list_data, fp=fp, ensure_ascii=False)
print('over!!!')
爬取企业详情信息(http://scxk.nmpa.gov.cn:81/xk/)
此时输入上述url响应信息为:每一个ID对应一个企业详情页数据
点击一个企业进入企业详情数据页(http://scxk.nmpa.gov.cn:81/xk/itownet/portal/dzpz.jsp?id=a6ede67d58d74c93b6e054f3d1a78b80)
域名和id拼接出完整企业对应详情的url
上述url参数对应上述ID,此时响应信息如下,即为企业详情数据json对象
动态加载数据
首页中对应的企业数据是通过Ajax请求得到的
通过对详情页的观察,url的域名都是一样的,只有携带的参数(id)不同
详情页的企业详情数据也是通过动态加载的
所有的post请求url是相同的,只有参数id是不同的
我们可以批量获取多家企业的id后,就可以将id’和url形成一个完整的详情页对应数据的Ajax请求的url
通过url请求、通过动态加载、通过Ajax请求
import requests
import json
if __name__ == "__main__":
# 1、批量获取不同企业的id值
url = 'http://scxk.nmpa.gov.cn:81/xk/itownet/portalAction.do?method=getXkzsList'
# 2、进行 UA伪装
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36'
}
# 5、存储企业id
id_list = []
# 存储所有企业详情数据
all_data_lst = []
# 2、参数的封装
for page in range(1, 16):
page = str(page)
data = {
'on': 'true',
'page': page,
'pageSize': '15',
'productName': ' ',
'conditionType': '1',
'applyname': ' ',
'applysn': ' '
}
# 3、发起请求
response = requests.post(url=url, data=data, headers=headers)
# 4、获取响应数据
json_ids = response.json()
for dic in json_ids['list']:
id_list.append(dic['ID'])
post_url = 'http://scxk.nmpa.gov.cn:81/xk/itownet/portalAction.do?method=getXkzsById'
# 6、获取企业详情数据
for id in id_list:
data = {
'id':id
}
# 获取企业详情数据
detail_json = requests.post(url=post_url, data=data, headers=headers).json()
all_data_lst.append(detail_json)
# 7、持久化存储
fp = open('./allData.json', 'w', encoding='utf-8')
json.dump(all_data_lst, fp=fp, ensure_ascii=False)
print('over!!!')