PYTHON爬虫学习笔记(二) -- Request模块

Request 模块
–urlib模块
–requests模块

requests模块:

python中原生的一款基于网络请求的模块,功能强大,简单便捷,效率高

作业:模拟浏览器发请求

使用方法:(requests模块的编码流程)
	--指定url
	--发送请求
	--获取响应数据
	--持久化存储

环境安装:
	pip install requests

实战编码:
	- 需求:爬取搜狗首页的页面数据

实例

1.简易网页采集器

# -*- coding: utf-8 -*-

'''
    爬虫步骤:
        --指定url
		--发送请求
		--获取响应数据
		--持久化存储
'''
'''
    反反爬机制:
    UA:User-Agent(请求载体的身份标识 )
    
    UA检测:门户网站的服务器会检测对应请求的载体身份标识,如果检测到请求的载体身份为
        某一款浏览器,则判定为一个正常的请求,如果不是的话,就表示这不是一个正常的请求(爬虫)
        则服务器端很可能拒绝该次请求
        
    UA伪装:让爬虫对应的请求载体身份标识伪装成某一款浏览器
'''



import requests
if __name__ == '__main__':
    
    #step1:指定url
    #通过字符串拼接,实现url指定关键字爬取
    #原对应网址:http://www.sogou.com/web?query=xxx
    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'#伪装浏览器 
    }
    url = 'http://www.sogou.com/web'#拼接字符串query=xxx
    #处理url携带的参数:封装到字典中
    kw = input('enter a world:')
    param = {
     
        'query' : kw    
    }
    
    
    #step2: 发送请求
    #发送的请求为url地址,返回到response中
    #对指定的url发起的请求对应的url是携带参数的,并且请求过程中处理了参数
    response = requests.get(url=url,params=param,headers=headers)#params--要拼接的参数
    
    
    #step3:获取响应数据
    #网站返回的数据为text文件的形式
    page_text = response.text
    
    
    #step4:持久化存储(写入文件)
    fileName = kw + '.html'
    with open(fileName,'w',encoding = 'utf-8') as fp:
        fp.write(page_text)
    print(fileName,'保存成功!!!')

2.破解百度翻译

获得对应请求页面中的一小部分内容,也就是百度翻译中的翻译结果

	从百度翻译中的实际操作可以看到,翻译结果模块是实时更新的,因此可以知道,
在输入要翻译的内容后,网页通过Ajax实时传输数据,因此要爬的是Ajax里面的信息
	--Post请求(携带了参数)(Ajax实时反馈的url是post请求)
	--响应数据是一组json数据
# -*- coding: utf-8 -*-

import requests
import json
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/86.0.4240.198 Safari/537.36'#伪装浏览器 
    }
    #3.post请求参数处理(同get请求抑制)
    word = input('enter a word:')
    data = {
     
        'kw':word #'kw'为网站post中的参数
    }
    #4.请求发送
    response = requests.post(url=post_url,data = data,headers=headers)#data和get中的params类似
    #因为获取的响应数据是json的形式
    #5.获取响应数据:json() 方法返回的是obj(如果确认响应数据是json类型的,才可以使用json())
    dic_obj = response.json()
    print(dic_obj)
    #6.持久化存储
    fileName = word + '.json'
    fp = open(fileName,'w',encoding='utf-8')
    #json形式的文件写入--json.dump()
    #由于返回的obj中有中文,因此ensure_ascii=False,中文不能存储为ascii
    json.dump(dic_obj,fp=fp,ensure_ascii=False)
    
    print('over!!!')

3.豆瓣排行榜案例(json+Get)

# -*- coding: utf-8 -*-

import requests
import json
if __name__ == '__main__':
    '''
        1.从F12中的数据找出豆瓣的url
            url:https://movie.douban.com/j/chart/top_list?type=11&interval_id=100%3A90&action=&start=20&limit=20
                通常问号后的内容通过字典的形式传输,所以删去并建立字典
        2.看标识中的content-type中看到:pplication/json; charset=utf-8
            可以看出网站更新的形式是json
        3.Request Method: GET -- get方法
    '''
    url = 'https://movie.douban.com/j/chart/top_list'
    param = {
     #建立字典传输数据
        'type':'11',
        '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('4.douban.json','w',encoding='utf-8')
    json.dump(list_data,fp=fp,ensure_ascii=False)
    
    print('over')

4.肯德基作业(text+post)

# -*- coding: utf-8 -*-

import requests
import json
if __name__ == "__main__":
    #1.指定url
    post_url = 'http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=keyword'#op不是字典内的,所以不要删,通过keyword传
    #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请求抑制)
    keyword = input('enter a word:')
    data = {
       
        'pid':'',
        'cname':'',
        'keyword':keyword, #'kw'为网站post中的参数
        'pageIndex':'1',
        'pageSize':'2',
    }
    #4.请求发送
    response = requests.post(url=post_url,data = data,headers=headers)#data和get中的params类似
    #Content-Type: text/plain; charset=utf-8 -- 返回的是text型的数据
    dic_obj = response.text
    print(dic_obj)
    #5.持久化存储
    fileName = keyword + '.html'
    with open(fileName,'w',encoding = 'utf-8') as fp:
        fp.write(dic_obj)
    
    print('over!!!')

#5.综合案例,获取药监局的注册详细信息(多页面的json数据传递,多数据储存)

# -*- coding: utf-8 -*-
'''
    项目说明:
        http://scxk.nmpa.gov.cn:81/xk/
        通过抓包发现,首页中的信息是动态加载的,并且是通过ajax动态请求到的
        Request URL: http://scxk.nmpa.gov.cn:81/xk/itownet/portalAction.do?method=getXkzsList
            on: true
            page: 1
            pageSize: 15
            productName: 
            conditionType: 1
            applyname: 
            applysn: 
        
       http://scxk.nmpa.gov.cn:81/xk/itownet/portal/dzpz.jsp?id=39213f625bf8425a8e871fb5b15e1dfa
           id: 39213f625bf8425a8e871fb5b15e1dfa 
       在详情页中的url中:
        -url的域名都是一样的,只是携带的参数(id)不一样
        -id值可以从首页对应的ajax请求到的json中获取
        -域名和id值拼接出一个完整的企业详情页
        -详情页的数据也是动态加载出来的
        
        Request URL: http://scxk.nmpa.gov.cn:81/xk/itownet/portalAction.do?method=getXkzsById
            id: 39213f625bf8425a8e871fb5b15e1dfa
        -对于详情页接收到的ajax数据,观察后发现
            -所有的post请求的url都是一样的,只有参数id值不一样
            -如果可以批量获取多家企业的id后,就可以将id和url形成一个完整的详情页
'''

import requests
import json
if __name__ == "__main__":
    #首先在首页中接收到的ajax信息中获取不同企业的ID值
    url = 'http://scxk.nmpa.gov.cn:81/xk/itownet/portalAction.do?method=getXkzsList'
    #url直接设置到ajax的地址
    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'#伪装浏览器 
    }
    id_list = []#定义列表装ID信息
    
    #动态获取多页的企业详情信息
    for page in range(1,6):
        page = str(page)#先将整形转换为字符型,才能封装到属性中
        #封装的属性
        data = {
     
            'on':'true',
            'page':'1',
            'pageSize':'15',
            'productName':'',
            'conditionType':'1',
            'applyname':'',
            'applysn':'',
        }
   
        #定义一个列表存储批量读取的企业ID
        json_ids = requests.post(url=url,headers=headers,data=data).json()#将第二第三部结合,简化
        #等同于先用respnce接受数据,然后将responce的json数据传给json_ids
        
        #经过观察,企业的信息都存储在json文件中的list属性中的字典,因此遍历list表,拿到ID值
       
        for dic in json_ids['list']:#遍历list列表,拿到字典中的数据
            id_list.append(dic['ID'])#获取列表内字典中的ID值
    
        
    #在批量获取完ID值中,开始获取企业的详情数据
    #因为同样是动态ajax获取,所以url设置为ajax地址即可
    all_Date = []#定义装读取的详情信息的列表
    post_url = "http://scxk.nmpa.gov.cn:81/xk/itownet/portalAction.do?method=getXkzsById"
    for id in id_list:
        #一个个获取ID表中数据,然后一个个获取详细信息
        data = {
     
            'id':id
        }
        detail_json = requests.post(url=post_url,headers=headers,data = data).json()
        all_Date.append(detail_json)
    
    #持久化存储
    fp = open('./allData.json','w',encoding='utf-8')
    json.dump(all_Date,fp=fp,ensure_ascii=False)
    print('over!!!')

你可能感兴趣的:(爬虫,python)