python爬虫实战之旅( 第二章:爬虫开发-requests模块)

上接:第一章:爬虫基础简介
下接:第三章:数据解析(正则法)

第二章:request模块

老版本多使用urllib模块,已被request模块取代

2.1request模块简介

  • 是python中原生的一款基于网络请求的模块,功能非常强大,简单便捷,效率极高。
  • 用于模拟浏览器发送请求。

2.2如何使用

2.2.1浏览器发出请求的过程(也就是我们request模块的编码流程):

  • 指定urt(就是输入自己想要打开的网址;urt的定义是内容为已安全位置,相当于网址)
  • 发起请求(模拟输入网址后按下回车的过程,这是一个https协议)
  • 获取响应数据(模拟网页打开的过程)
  • 持久化存取(存取相应的数据)

2.2.2环境安装
①cmd:

pip install request

②pycharm中直接配置:
在这里插入图片描述

2.3实战编码

2.3.1以爬取搜狗首页数据为例www.sogou.com

#爬取搜狗的首页数据
import requests
if __name__=="__main__":
    #step1:指定url
    url = 'http://www.sogou.com/'
    #step2:发送请求
    #同时get()方法会返回一个响应对象
    response=requests.get(url=url)
    #step3:获取相应数据
    page_text = response.text
    print(page_text)
    #step4:持久化存储
    with open("./sogou.html",'w',encoding='utf-8')as fp:
        fp.write(page_text)
    print("爬取数据结束!")
    pass

输出结果:
可以代码正常运行,同时在当前项目下生成了相应的html格式的文件记录page_text保存的内容。

在这里插入图片描述
爬取到的页面打开与原始页面对比:
在这里插入图片描述
在这里插入图片描述

2.3.2爬取搜狗指定词条对应的搜索结果页面(实现简易网页采集器)

在这里插入图片描述
前提了解:
query=后对应我们要搜索的关键词
运用python中字典的相关知识可以将query变成一个实时输入关键字的状态。
② 准备UA伪装:一种反反爬策略
UA-User-Agent(请求载体的身份标识)
查看自己的UA可以:在当前页面点击鼠标右键——检查——如图红框
在这里插入图片描述
当然你也可以不用自己的身份标识
UA随机生成器

UA检测:就是在门户网站的服务器检测对应请求的载体身份标识时,如果检测到请求的载体身份为某一款浏览器的标识,则说明该请求是一个正常的请求,否则识别为一个不正常的请求(爬虫),那么服务器就会拒绝请求从而使爬虫无法爬取数据。
所以UA伪装:就是让爬虫对应的请求载体身份标识为伪装为某一款浏览器,然后get()函数中的headers参数就是user-agent()身份标识。
代码:

#!/usr/bin/env python
#-*- coding:utf-8 -*-
import  requests
if __name__=="__main__":
    #UA伪装
    headers={
        'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.11 Safari/537.36'
    }
    url="https://www.sogou.com/web?query="
    #处理url携带的参数:封装到字典中
    kw=input('please enter a key word:')
    param={
        'query':kw
    }
    #对指定的url发起的请求,且请求过程可以处理参数,这就变成了一个实时动态的过程
    response=requests.get(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)
        pass
    print(filename,'保存成功!')
    pass

输出结果:可以看到爬取到的query.html文件成功保存
在这里插入图片描述

2.3.3破解百度翻译获取局部数据

首先进入百度翻译,分析翻译部分存在Ajax请求
(AJAX 是一种用于创建快速动态网页的技术。
通过在后台与服务器进行少量数据交换,AJAX 可以使网页实现异步更新。这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新。)
通过F12抓包工具分析Ajax请求
确定URL和使用POST方法
鼠标右键当前的百度翻译页面——检查——如图红框在这里插入图片描述
找到几个数据包中找到既为post请求,同时传参是我们输入的要翻译的字符的,这是因为我们需要爬取的数据并不是整个翻译页面的信息,我们只需要翻译“dog”得到的信息,这一步相当于就是寻找dog翻译在该页面对应的板块。
(在这里留个坑,我自己查看相应的请求时始终找不到翻译界面所对应的sug,意思就是我下面的图中显示的四个包不对,正确的应该是三个sug加两个另外的包,而代码中强制访问https://fanyi.baidu.com/sug是允许的。还没有想通~~)
在这里插入图片描述
同时注意回应的一组数据是json格式。
json.dump在默认情况下,对于非ascii字符生成的是相对应的字符编码,而非原始字符,所以调用json.dump时对应的参数ensure_ascii要改为false

#!/usr/bin/env python
# -*- coding:utf-8 -*-
import requests
import json

if __name__ == "__main__":
    # 1.UA伪装
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.11 Safari/537.36'
    }
    # 2.指定url
    post_url = "https://fanyi.baidu.com/sug"
    # 3.post请求参数处理(需要翻译的信息)
    word = input('please enter a word you want to translate:')
    data = {
        'kw': word
    }
    # 4.请求发送
    response = requests.post(url=post_url, data=data, headers=headers)
    # 5.获取响应的数据:json()方法返回的是一个字典对象obj
    # 注意上述方法只适用于相应数据是json串
    dic_obj = response.json()
    # 6.持久化存储
    filename = word + '.json'
    fp = open(filename, 'w', encoding='utf-8')
    json.dump(obj=dic_obj, fp=fp, skipkeys=False,ensure_ascii=False)
    print(filename, '翻译成功!')

    pass

结果:
在这里插入图片描述

2.3.4爬取豆瓣电影分类排行榜https://movie.douban.com/中的电影详情数据

在这里插入图片描述
注意requests.get()中的params参数与抓包中显示的参数一致:
在这里插入图片描述
代码:

#!/usr/bin/env python
# -*- coding:utf-8 -*-
import requests
import json
if __name__=="__main__":
    url="https://movie.douban.com/j/chart/top_list"
    params={
        '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/88.0.4324.11 Safari/537.36'
    }
    response = requests.get(url,params=params,headers=headers)
    list_data = response.json()
    fp=open('./douban.json','w',encoding='utf-8')
    json.dump(list_data,fp=fp,ensure_ascii=False)
    print("读取电影排名成功!")

    pass

输出结果:
在这里插入图片描述

2.3.5爬取肯德基餐厅查询http://www.kfc.com.cn/kfccda.index.aspx中指定地点的餐厅数

道理相同,不过这次抓包信息中的访问函数是post,代码也可以进行改进,将keyword动态化。
代码:

#!/usr/bin/env python
# -*- coding:utf-8 -*-
import json
import requests
if __name__ == "__main__":
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.11 Safari/537.36'
    }
    url = "http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=keyword"
    params ={
        'cname':'',
        'pid':'',
        'keyword':"北京",
        'pageIndex':'1',
        'pageSize':'10',
    }
    response = requests.post(url=url,params=params,headers=headers)
    get_data=response.json()
    fp=open(".kfc_store_list.json",'w',encoding='utf-8')
    json.dump(get_data,fp=fp,ensure_ascii=False)
    print("获取地址信息成功!")
    pass

输出结果:
在这里插入图片描述

2.3.6爬取国家药品监督管理总局中基于中华人民共和国化妆品生产许可证相关数据

http://scxk.nmpa.gov.cn:81/xk/
分为下列几个步骤:
①动态加载数据
在这里插入图片描述

②首页中对应的企业信息数据是通过ajax动态请求到的
但是此时网页显示的只是概览,并不是详情数据,需要我们选择某一栏打开才能看到诸多详情数据:
在这里插入图片描述

这意味着我们最后抓取的数据并不能通过药监局的url:http://scxk.nmpa.gov.cn:81/xk/直接访问得到,即我们想要得到的数据属于:动态加载数据。
于是我们尝试这种动态加载数据是否可以通过ajex抓包进行获取
在这里插入图片描述
在鼠标进行点击时,我们成功捕获了一个请求,但我们不确定这是不是我们要寻找的,于是可以点击“回击”查看内容
在这里插入图片描述
内容是json格式看不懂,没有关系,格式化转化为汉字格式就可以确定内容是不是我们想要的
在这里插入图片描述
我们的想法得到了验证,首页中对应的企业信息数据是通过ajax动态请求得到的,同时我们仔细观察得到的数据和我们最终想要爬取的信息页面的url的练习可以发现:
在这里插入图片描述
③再对比其他超链接选项打开的页面,发现:

  • 所有的url的域名都是一样的,只有携带的参数ID不一样;
  • 而ID值又可以从首页对应的ajax请求到的json串中获取;
  • 域名和id值得拼接可以得到一个完整企业对应的详情页的url

④详情页的企业详情数据也是动态加载出来的
观察后发现:

  • 所有的post请求和url都是一样的,只有参数id值不同
  • 如果我们可以批量获取多家企业的id后,就可以将id和url形成一个完整的详情页对应详情数据

如下图:我们打开详情页之后发现加载的详细信息也有一个Ajax请求,说明也是动态数据:在这里插入图片描述
在这里插入图片描述
切换回XHR信息,我们找到一个数据包,并且发现它的参数就是我们之前得到的ID
在这里插入图片描述

编写代码:

#!/usr/bin/env python
# -*- coding:utf-8 -*-
import requests
import json
if __name__=="__main__":
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.11 Safari/537.36'
    }
    #批量获取不同企业的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':'',
    }
    json_ids=requests.post(url=url,headers=headers,data=data).json()
    id_list = []#存储企业的id
    detail_data_list=[]#存储所有的企业详情数据
    for dic in json_ids['list']:
        id_list.append(dic['ID'])
        pass
    #获取企业详情数据
    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()
        detail_data_list.append(detail_json)
        pass
    #持久化存储所有详情页信息
    fp=open("detail.json",'w',encoding='utf-8')
    json.dump(detail_data_list,fp=fp,ensure_ascii=False)
    print("爬取成功!")
    pass

python快速给headers等字典加上引号
首先选择我们要加引号的部分,然后ctrl+R
出现以下对话框,先选择右上角regex
然后在上方输入框输入(.*?):(.*)
下方输入'$1':'$2',
再点击replace all 就可以啦
在这里插入图片描述

结果:

在这里插入图片描述
同理,想要实时输入要获取信息的页码可以改变相应的data中的参数。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值