doraemon的python 爬虫(requests模块)
### 2.requests模块 - 概念:一个基于网络请求的模块.作用就是用来模拟浏览器发起请求. - 编码流程: - 指定url - 进行请求的发送 - 获取响应数据(爬取到的数据) - 持久化存储 - 环境的安装: - pip install requests **requests:** - get/post: - url - data/params:对请求参数的封装 - headers:UA伪装 - 什么是动态加载的数据:由另一个额外的请求请求到的数据 - ajax - js - 如何鉴定页面中是否有动态加载的数据? - 局部搜索 - 全局搜索 - 对一个陌生网站进行爬取前的第一步做什么? - 确定你要爬取的数据是否为动态加载的!!! #### 2.1中文乱码问题 ```python #解决中文乱码 wd = input('enter a key:') url = 'https://www.sogou.com/web' #存储的就是动态的请求参数 params = { 'query':wd } #一定需要将params作用到请求中 #params参数表示的是对请求url参数的封装 response = requests.get(url=url,params=params) #手动修改响应数据的编码!!!!!!!!! response.encoding = 'utf-8' page_text = response.text fileName = wd+'.html' with open(fileName,'w',encoding='utf-8') as fp: fp.write(page_text) print(wd,'下载成功!') ``` #### 2.2 UA反爬机制和UA伪装 ```python #问题:大多数网站会对请求进行验证,如果不是浏览器发起的请求,服务端就会拒绝访问 #解决中文乱码&UA伪装 wd = input('enter a key:') url = 'https://www.sogou.com/web' #存储的就是动态的请求参数 params = { 'query':wd } #即将发起请求对应的头信息 headers = { 'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36' } #一定需要将params作用到请求中 #params参数表示的是对请求url参数的封装 #headers参数是用来实现UA伪装 response = requests.get(url=url,params=params,headers=headers) #手动修改响应数据的编码 response.encoding = 'utf-8' page_text = response.text fileName = wd+'.html' with open(fileName,'w',encoding='utf-8') as fp: fp.write(page_text) print(wd,'下载成功!') ``` #### 2.3 动态加载的数据 如何判定一张页面中是否有动态加载的数据? - 抓包工具进行局部搜索 - 如果判定出页面中有动态加载的数据如何进行数据的定位? - 使用抓包工具进行全局搜索 - 对一个陌生的网站数据进行爬取前一定要判定你爬取的数据是否为动态加载的!!! ```python #示例需求 爬取企业详情信息:http://125.35.6.84:81/xk/ 分析: 1.网站的首页和企业的详情页的数据都是动态加载出来的 2.分析某一家企业的企业详情数据是怎么来的? 企业详情数据时通过一个ajax请求(post)请求到的. 请求对应的url:http://125.35.6.84:81/xk/itownet/portalAction.do?method=getXkzsById 该请求携带了一个参数:id:xxdxxxx 结论: 1.每家企业详情页的数据都是通过一个post形式的ajax请求请求到的 2.每家企业对应的ajax请求的url都一样,请求方式都是post,只有请求参数id的值不一样. 3.只需要获取每一家企业对应的id值即可获取每一家企业对应的详情数据 需要获取每一家企业的id值 思路:每一家企业的id值应该存储在首页对应的相关请求或者响应中. 结论:每一家企业的id值是存储在首页中的某一个ajax请求对应的响应数据中,只需要将该响应数据中企业的id提取/解析出来后即可. ``` ```python #代码实现 #要请求到没一家企业对应的id url = 'http://125.35.6.84:81/xk/itownet/portalAction.do?method=getXkzsList' data = { 'on': 'true', 'page': '1', 'pageSize': '15', 'productName': '', 'conditionType': '1', 'applyname': '', 'applysn': '', } fp = open('./company_detail.txt','w',encoding='utf-8') #该json()的返回值中就有每一家企业的id data_dic = requests.post(url=url,data=data,headers=headers).json() #解析id for dic in data_dic['list']: _id = dic['ID'] # print(_id) #对每一个id对应的企业详情数据进行捕获(发起请求) post_url = 'http://125.35.6.84:81/xk/itownet/portalAction.do?method=getXkzsById' post_data = { 'id':_id } #json的返回值是某一家企业的详情信息 detail_dic = requests.post(url=post_url,data=post_data,headers=headers).json() company_title = detail_dic['epsName'] address = detail_dic['epsProductAddress'] fp.write(company_title+':'+address+'\n') print(company_title,'爬取成功!!!') fp.close() ```