UA伪装:门户网站的服务器会检测对应请求的载体身份标识,如果检测到请求的载体身份为某以款浏览器,说明该请求是一个正常的请求。都是如果检测到的请求的载体身份标识不是基于某一款浏览器的,则表示该请求为不正常的请求(爬虫),则服务器端就很有可能拒绝该次请求。
所以正常爬取会失败,所以我们要使用UA伪装。
UA伪装:让爬虫对应的请求载体身份标识伪装成某一款浏览器。
注:浏览器身份标识可以从浏览器右键的检查,
找到User-Agent。
最后我们就可以写出爬取指定数据的代码了
import requests #UA伪装:将对应的User-Agent封装到一个字典中 headers = { 'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36' } url='https://www.sogou.com/web?' #处理url携带的参数:封装到字典中 kw = input('enter a word:') param = { 'query':kw } 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 json import requests post_url='https://fanyi.baidu.com/sug' #进行UA伪装 headers = { 'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36' } #post请求参数处理(同get请求一致) word = input('entry a word:') data = { 'kw':word } #发送请求 response = requests.post(url=post_url,data=data,headers=headers) #获取响应数据:json()方法返回的是一个对象(如果确认响应数据是json类型的才能使用json()) dic_obc = response.json() #进行持久化存储 fileName = word+'.json' fp = open(fileName,'w',encoding='utf-8') json.dump(dic_obc,fp=fp,ensure_ascii=False) print('结束')
import json import requests url = 'https://movie.douban.com/j/chart/top_list' param = { 'type': '24', 'interval_id': '100:90', 'action':'', 'start': '0',#start表示从库中第几部电影获取 'limit': '20',#limit表示一次获取多少部电影 } headers = { 'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36' } reponse = requests.get(url=url,headers=headers,params=param) list_data = reponse.json() fp = open('./douban.json','w',encoding='utf-8') json.dump(list_data,fp=fp,ensure_ascii=False) print('over')
将上图的数据复制到json格式化工具BEJSON中
爬取的第一个是“憨豆先生精选辑”和豆瓣电影中的一样
说明没有错误。
首页中对应的企业信息数据是通过ajax动态请求到的。
通过观察详情页发现url的域名都是一样的,只有携带的参数(id)不一样,id值可以从首页对应的ajax请求到的json串中获取。
详情页企业数据也是动态加载出来的,再观察发现所有post请求的url都是一样的,只有参数id不一样。
import json import requests #批量获取不同企业的id值 url = 'http://scxk.nmpa.gov.cn:81/xk/itownet/portalAction.do?method=getXkzsList' #参数的键值 data = { 'on': 'true', 'page': '1', 'pageSize': '15', 'productName':'', 'conditionType': '1', 'applyname':'', 'applysn':'', } headers = { 'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36' } id_list = []#添加企业的id all_data_list = []#储存所有的企业详情数据 ison_ids = requests.post(url=url,data=data,headers=headers).json() for dic in ison_ids['list']: id_list.append(dic['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) #持久化存储all_data_list with open('./allData.json','w',encoding='utf-8') as fp: json.dump(all_data_list,fp=fp,ensure_ascii=False) print('over
import json import requests #批量获取不同企业的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/90.0.4430.93 Safari/537.36' } id_list = []#添加企业的id all_data_list = []#储存所有的企业详情数据 #参数的键值 for page in range(1,6): page = str(page) data = { 'on': 'true', 'page': page, 'pageSize': '15', 'productName':'', 'conditionType': '1', 'applyname':'', 'applysn':'', } ison_ids = requests.post(url=url,data=data,headers=headers).json() for dic in ison_ids['list']: id_list.append(dic['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) #持久化存储all_data_list with open('./allData.json','w',encoding='utf-8') as fp: json.dump(all_data_list,fp=fp,ensure_ascii=False) print('over')