pathon爬虫之request模块的使用

会有一股神秘感。 提交于 2020-04-07 16:45:48

1.request

1.基于网络请求的模块。
2.环境的安装:pip install requests
3.作用:模拟浏览器发起请求
4.分析requests的编码流程:
    1.指定url
    2.发起了请求
    3.获取响应数据
    4.持久化存储

2.需求:爬取搜狗首页的页面源码数据

import requests
#1.指定url
url = 'https://www.sogou.com/'

#2.发起请求,get的返回值是一个响应对象
response = requests.get(url)

#3.获取响应数据,text属性返回的是字符串形式的响应数据
page_text = response.text

#4,持久化存储
with open('./sogou.html','w',encoding='utf-8') as fp:
    fp.write(page_text)

3.需求:简易的网页采集器

url = 'https://www.sogou.com/web?query=人民币'
response = requests.get(url)
#修改响应数据的编码格式
response.encoding = 'utf-8'
page_text = response.text
with open('./人民币.html','w',encoding='utf-8') as fp:
    fp.write(page_text)

4.处理数据量级的问题:

1.遇到了对应的反爬机制
2.反爬机制:UA检测
3.反反爬策略:UA伪装
4.UA伪装的实现:
    1.定义一个字典
    2.在字典中进行相关请求头信息的伪装
    3.将该字典作用到get方法的headers参数中即可
    UA检测被作用到了大量的网站中,因此日后,爬虫程序编写中一定要直接加上UA的操作
5.请求参数的动态化
    实现:
    1.定义一个字典
    2.字典中的键值就是url携带的参数
    3..将字典作用到get方法的params参数中

5.需求:爬取豆瓣电影的详情数据

  • 分析: 更多的电影数据是通过将滚轮滑动到底部后发起了ajax请求请求到的电影数据 对ajax请求的url进行捕获 对ajax请求的url进行请求发送
url = 'https://movie.douban.com/j/chart/top_list'
fp = open('./movieData.txt','a+',encoding='utf-8')
for i in range(0,10):
    param = {
        'type': '13',
        'interval_id': '100:90',
        'action': '',
        'start': str(i*20),
        'limit': '20',
    }
    response = requests.get(url=url,params=param,headers=headers)
    #json()将json串进行序列化
    movie_list = response.json()
    for dic in movie_list:
        name = dic['title']
        score = dic['score']
        fp.write(name+':'+score+'\n')
    print('第{}页数据爬取成功!'.format(i))
fp.close()

6.肯德基餐厅查询http://www.kfc.com.cn/kfccda/storelist/index.aspx

  • 分析: 1.动态加载数据 概念:通过其他/另一个请求请求到的数据 特性:可见非可得 2.判定相关的页面数据是否为动态加载的数据? 基于抓包工具定位到浏览器地址栏url对应的请求数据包,进行局部搜索: - 搜索到:这组被搜索的数据不是动态加载的,可以直接爬取 - 没有搜到:这组数据是动态加载的,不可以直接爬取。 3.如何捕获动态加载的数据? 基于抓包工具进行全局搜索,最终可以定位到动态加载数据对应的数据包。
import requests
headers = {
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36'
}
data = {
    'cname': '',
    'pid': '',
    'keyword': '广州',
    'pageIndex': '1',
    'pageSize': '10',
}
url = 'http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=keyword'
response = requests.post(url=url,headers=headers,data=data)
pos_data = response.json()
pos_data

7.药监总局数据爬取,爬取的是每一家企业的详情数据

  • 分析: 1.打开了某一家企业的详情页面,看到了企业的详情数据 2.判定改家企业的详情数据是否为动态加载的? 进行局部搜索 - 没有搜索到,说明数据是动态加载出来的 捕获动态加载的数据? - 全局搜索,定位到了动态加载数据对应的数据包,提取出了url和请求参数 3.成功的捕获到了一家企业对应的详情数据 4.通过上述方式继续分析第二家企业,发现: 每一家企业对应动态加载数据的url都一样:http://125.35.6.84:81/xk/itownet/portalAction.do?method=getXkzsById,只要请求参数id的值不一样!说明id值标识的就是每一家企业的唯一标识。 5.捕获每一家企业的id 在首页中,通过抓包工具对企业名称进行搜索,对应的数据包中发现了企业名称和id - url:http://125.35.6.84:81/xk/itownet/portalAction.do?method=getXkzsList
#获取企业id
ids = [] #存储所有企业的id
url = 'http://125.35.6.84:81/xk/itownet/portalAction.do?method=getXkzsList'
for page in range(1,6):
    data = {
        'on': 'true',
        'page': str(page),
        'pageSize': '15',
        'productName': '',
        'conditionType': '1',
        'applyname': '',
        'applysn': '',
    }
    company_datas_json = requests.post(url=url,headers=headers,data=data).json()
    for dic in company_datas_json['list']:
        _id = dic['ID']
        ids.append(_id)
        
detail_url = 'http://125.35.6.84:81/xk/itownet/portalAction.do?method=getXkzsById'       
for _id in ids:
    data = {
    'id':_id
    }
    company_json = requests.post(url=detail_url,headers=headers,data=data).json()
    print(company_json['epsName'],company_json['epsProductAddress'])
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!