2025年3月25日 星期二 甲辰(龙)年 月廿四 设为首页 加入收藏
rss
您当前的位置:首页 > 计算机 > 编程开发 > Python

Python爬虫之requests模块

时间:10-19来源:作者:点击数:57

Python爬虫 之 requests模块

简述get和post

  • requests主要有两个小的数据请求方式get和post
  • 如何在网页上进行分辨呢?

1.可以直接在检查界面看到请求方式

啊啊啊啊啊

2.在检查界面看看是否有From Data数据,若有就是post,没有就是get

111111111

编码基本流程:

  1. 指定url
  2. 发起请求
  3. 获取响应数据
  4. 持续化储存

网址解析:

栗子:https://www.baidu.com/s?wd=孙一宁

?前可理解为目标网址总目录即https://www.baidu.com/s?

?后为搜索内容,相当于字典即:wd=孙一宁,‘wd’ 为字典的键,‘孙一宁’ 为值。

在requests.get/post中params/data使用参数,那么注意在url中对于params/data中字典键的去除。

(可能有朋友不耐烦了,啥玩意儿!!!)

表慌,栗子:

  • https://movie.douban.com/typerank?type_name=%E5%96%9C%E5%89%A7&type=24&interval_id=100:90
  • 用该网址举三个例子:
  • 1.param={}
  • response=requests.get(url='https://movie.douban.com/typerank?type_name=%E5%96%9C%E5%89%A7&type=24&interval_id=100:90 ',
  • params=param)
  • 2. param={
  • "type_name":"%E5%96%9C%E5%89%A7",
  • "type":'24',
  • "interval_id":'100:90'
  • }
  • response=requests.get(url='https://movie.douban.com/typerank?'
  • params=param)
  • 3.param={
  • "type_name":"%E5%96%9C%E5%89%A7",
  • "type":'24',
  • }
  • response=requests.get(url='https://movie.douban.com/typerank?interval_id=100:90
  • params=param)

requests第一滴血–淘宝主界面

了解源码界面
淘宝
代码实现
  • #导库
  • import requests
  • #指定url
  • url="https://uland.taobao.com/"
  • #发送请求get(url, params=None, **kwargs)
  • response=requests.get(url=url,)
  • #转成文本数据
  • page_text=response.text
  • #打印出文本
  • print(page_text)
  • #存储数据
  • #只写打开文件,输入文本类型为utf-8
  • fp=open(file="./sou_gou_shu_ju.html",mode='w',encoding="utf-8")
  • #文本写入
  • fp.write(page_text)
  • fp.close()
  • print("爬爬爬over")

百度网页采集器

百度网址分析
  • 有些小伙伴是这样的
  • https://www.baidu.com/?tn=11111111_6_dg
  • tn=11111111_6_dg直接删除
百度
  • 搜索后发现网页多了一个 &wd=李一桐
  • & 这是参数分隔符
  • wd 参数名称
  • 李一桐 当然是我们搜索内容了
  • 等!!!那我要是想看其他小姐姐怎么办!!!
  • 好家伙!李一桐姐姐不香了吗?安排!!!
  • params/data登场
一桐
在这里插入图片描述
搜索动态代码实现
  • import requests
  • url="https://www.baidu.com/s?"
  • #自定义搜索内容
  • kw=input("想搜索啥子呢?")
  • #get中params参数预备
  • param={
  • "wd":kw,
  • }
  • #注:不同浏览器键值不同,即wd不同,例如搜狗为query
  • #对于params参数,会在url后自动添加params字典中的键和值,即会自动添加 wd=kw 在url后,然后请求。
  • #当kw输入‘孙一宁’时,那么相当于url为"https://www.baidu.com/s?wd=孙一宁"
  • response=requests.get(url=url
  • ,params=param
  • ,)
  • page_text=response.text
  • print(page_text)
  • #根据搜索内容确定保存文件名称file_name
  • file_name=kw+".html"
  • fp = open(file=file_name,mode='w+',encoding="utf-8")
  • fp.write(page_text)
  • fp.close()
  • print("爬爬爬over")

网页UA检测/伪装反反爬机制

UA预备知识
  • UA:User-Agent(请求载体身份标识)

  • UA检测 : 门户网站的服务器会检测对应请求的载体身份标识,如果载体身份标识为浏览器则正常运行。那么我们的爬虫程序可能会被阻止,那么我们要将爬虫伪装成UA浏览器标识。

  • 在以后爬去网站数据的时候,一般都需要UA伪装,因为大部分浏览器都会进行UA检测。

让我们看看User-Agent在哪吧

User-Agent

注:User-Agent同一个电脑浏览器一般是不变的哈

有了User-Agent,我们就能把UA检测按在地上摩擦!!!强暴。。。

UA伪装代码实现
  • import requests
  • url="https://www.baidu.com/s?"
  • header={
  • "User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36 SLBrowser/7.0.0.5211 SLBChan/25"
  • }
  • kw=input("想搜索啥子呢?")
  • param={
  • "wd":kw,
  • }
  • #headers参数填入身份标识
  • response=requests.get(url=url
  • ,params=param
  • ,headers=header
  • )
  • page_text=response.text
  • print(page_text)
  • #根据搜索内容确定保存文件名称file_name
  • file_name=kw+".html"
  • fp = open(file=file_name,mode='w+',encoding="utf-8")
  • fp.write(page_text)
  • fp.close()
  • print("爬爬爬over")

该程序即可在生成的文件中用浏览器直接打开,直接进入到搜索后的页面。

在这里插入图片描述

进入(右边的姐姐好漂亮,左边?):

结果

爬虫爬区百度翻译数据

预备知识
  • 首先我们要了解百度翻译的机制(阿贾克斯请求):
  • 1. url的确定
  • 2. User-Agent的确定
  • 3. data数据内容
  • 4. response数据返回类型
  • 5. Request Method 请求方式

首先

阿贾克斯(Ajax):当我们在打开一个界面时输入相应的内容,并没有按下回车键,就会自动帮我们搜索相应的结果,这个过程就称为阿贾克斯请求。在电脑端的百度,谷歌等浏览器中经常见到。

(我们打开一个界面检查后,进入Network,在网址不改变的情况下看到的新Name就是阿贾克斯请求)

对于ajax响应数据通常是用json来解析数据

在进行阿贾克斯请求时网址是不变的啊!!!

在进行阿贾克斯请求时网址是不变的啊!!!

在进行阿贾克斯请求时网址是不变的啊!!!

在这里插入图片描述
response

注意:一定要先打开检查,后输入翻译内容!!!

因为name下有许多个目录,我们要挨个寻找 from date为我们输入的数据的Name,即sug,同时要注意response的内容是否为我们需要的。

  1. url的确定
  2. Request Method 请求方式
urlandmethod
  1. User-Agent的确定
  2. data数据内容
    qqqq
  3. response数据返回类型
    contenttype
一切准备就绪,开始破解强暴!!!
  • import json
  • import requests
  • #url的确定
  • url="https://fanyi.baidu.com/sug"
  • #User-Agent的确定
  • header={
  • "User-Agent":"Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.101 Mobile Safari/537.36 Edg/91.0.864.48"
  • }
  • #翻译数据
  • kw=input("想翻译啥子呢?")
  • #from data 的数据名为键,kw为值
  • data={
  • "kw":kw
  • }
  • #请求方式不在是get,而是post
  • response=requests.post(url=url
  • ,data=data#同get里的params
  • ,headers=header
  • )
  • page_json=response.json()
  • print(page_json)
  • file_name=kw+"translate.html"
  • fp = open(file=file_name,mode='w',encoding="utf-8")
  • json.dump(page_json#储存数据
  • ,fp=fp#存储地址
  • ,ensure_ascii=False#是否以ASCLL内容格式存储,由于翻译内容包含汉字,而ASCLL中没有汉字,所以False.
  • )
  • fp.close()#打开后一定要关闭文件,否则不能在文件中看到存储内容
  • print("爬爬爬over")

豆瓣电影排行

数据解析
  1. URL get type:
    shujujiexi
  2. User-Agent 和 params参数:
    asfasfsaf
  3. 别忘了瞄一眼结果啊在这里插入图片描述
整体数据代码实现
  • import json
  • import requests
  • url="https://movie.douban.com/j/chart/top_list?"
  • header={
  • "User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36 SLBrowser/7.0.0.5211 SLBChan/25"
  • }
  • param={
  • 'type': '24'
  • ,'interval_id': '100:90'
  • ,'action':''
  • ,'start': '0'#爬去开始位置
  • ,'limit': '10'#每次爬取数据个数
  • }
  • response=requests.get(url=url
  • ,params=param
  • ,headers=header)
  • page_json=response.json()
  • print(page_json)
  • fp = open(file="dou_ban.json",mode='w+',encoding="utf-8")
  • json.dump(page_json,fp=fp,ensure_ascii=False)
  • fp.close()
  • print("爬爬爬over")

呢,十个object

json工具

什么玩意儿这一堆东西玩我呢???我只想要排名,什么都不要。

在这里插入图片描述

那么----------展开第一个object,哇哇哇!!!

类1
局部数据代码实现(排名)
  • import json
  • import requests
  • url="https://movie.douban.com/j/chart/top_list?"
  • header={
  • "User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36 SLBrowser/7.0.0.5211 SLBChan/25"
  • }
  • param={
  • 'type': '24'
  • ,'interval_id': '100:90'
  • ,'action':''
  • ,'start': '0'#爬去开始位置
  • ,'limit': '10'#每次爬取数据个数
  • }
  • response=requests.get(url=url
  • ,params=param
  • ,headers=header)
  • movie_json=response.json()
  • fp = open(file="movie_rank.html",mode='w+',encoding="utf-8")
  • for each_movie in movie_json:
  • json.dump([each_movie['rank'],each_movie['title']], fp=fp, ensure_ascii=False)
  • fp.write('\n')
  • fp.close()
  • print("爬爬爬over")

看结果:

工作餐

over~~~

国家药品化妆品许可证企业公司详细信息

网址:

国家药品化妆品许可证管理系统

来喽!!!进局子喽。。。。

解析界面和数据位置

先看看界面

药品管理
v
寻找爬取数据内容位置方式一-----间接搜索

我们的目的爬取所有企业的详细数据信息,是不是感觉直接拿到网址就可以了???你太天真了!!!

来我替你试试

验证错误思路
  • import json
  • import requests
  • url="http://scxk.nmpa.gov.cn:81/xk/"
  • header={
  • "User-Agent":"Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.101 Mobile Safari/537.36 Edg/91.0.864.48"
  • }
  • response=requests.get(url=url
  • ,headers=header).text
  • fp = open(file="qqqqq.html",mode='w+',encoding="utf-8")
  • json.dump(response, fp=fp, ensure_ascii=False)
  • fp.close()
  • print("爬爬爬over")

也许你会得到:

aaaaaa

打开后:

乱码

神马鬼???

来,试试这个方法!!!

额额额额

点View就会看到想要的结果:

asfafsafafs

然后再把它粘贴到文件中

sdgdg

打开后

姐还是安分

突然感觉自己的电脑卡了一样。但是不要慌,你再等10年也是这样的!!!

那么麻烦,有没有简单的的办法???

当然!!!

试试这样:

嘘嘘

你会发现在那个response中没有你搜索的数据(0 of 0)。

说明仅仅直接爬取网址的思路行不通

正确引导

到这里我们开始怀疑他是否是一个阿贾克斯请求。

嘿!!!确实是!!!

(可以不在ALL下找,可在XHR下找阿贾克斯)

阿贾克斯

到这里有个小伙伴又说了:你写的这是什么玩意儿?那么麻烦,不玩了不玩了!!!

哎???别慌!!!从这开始就可以直接忽略前面那一段的BB,进行下面的方式二

寻找爬取数据内容位置方式二------直接搜索
孙菲菲

是不是非常简单

这时,你会发现在keyword下出现该我们搜索的文字内容,并且在portalAction下,说明portalAction下存在和《中山市泛华精细化学品有限公司》同级别的数据,portalAction*就是我们所苦苦寻找的!!!

在这里插入图片描述
准确位置的确定

放在json中验证一下

阿发方式发

原来数据就放在portalAction中的List中!!!

接下来:

我们发现就那么多信息怎么能满足我?我要一步步进入拿到所有详情数据!!!

但是我要如何通过该网址界面搜索到关于这些公司更多的信息呢?此时我们会发现在公司名字上面有一个ID

难道这就是突破问题的关键???确实是!!!

爬去详细信息的进入方式

来我们拿出两个公司详细界面的网址做一下对比

  • http://scxk.nmpa.gov.cn:81/xk/itownet/portal/dzpz.jsp?id=edec7603b4c34048a5c4aa489bfee8f8
  • http://scxk.nmpa.gov.cn:81/xk/itownet/portal/dzpz.jsp?id=cf17ff0d3eb442d6bbcf79efa9996050

对,没错,只有ID不同,那么我们可以通过阿贾克斯请求来获取每一个公司地址的ID,进而抓取其所有的信息!!!

那么问题紧接着又来,我们进入每一个公司信息界面后,他们的信息是通过什么储存的。然我们探索"亿"下

达芙妮

我想聪明的你又看出来了!!!没错又是阿贾克斯请求

在json中看看:

在这里插入图片描述

好了!!!数据位置已经定位完成。

正片开始了!!!

代码实现

先让我们对于以上分析过程做一个整体的概括。

  • 我们发现网址界面内容为动态数据下载,对应的企业信息,通过阿贾克斯动态请求得到
  • 然后通过详情页面的URL,发现域名一样,参数ID不一样,ID值可以从首页对应的阿贾克斯请求Jason自创中获取。域名和ID值拼接就可以得到完整的企业详情页面的URL。
  • 对于每个详情页面的URL都是一样的,只有参数ID不同,那么我们可以通过获取多家企业的ID,就可以将URL和ID形成完整的详情页面。
  • 最后对详情界面一一爬取

主页面参数

gvz
asfsf

详细页面参数

wfazsfas
wfefef
  • import json
  • import requests
  • # User-Agent:
  • header = {
  • "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36 SLBrowser/7.0.0.5211 SLBChan/25"
  • }
  • # 主页面url
  • url_1 = "http://scxk.nmpa.gov.cn:81/xk/itownet/portalAction.do?method=getXkzsList"
  • ID_list = [] # 存储ID
  • detail_list = [] # 存储结果
  • for page in range(1, 6):
  • """为了爬取第1到第5页所有公司数据"""
  • data_1 = {
  • 'on': 'true'
  • , 'page': page # 爬去数据页数
  • , 'pageSize': '15' # 每次爬取数量
  • , 'productName': ''
  • , 'conditionType': '1'
  • , 'applyname': ''
  • , 'applysn': ''
  • }
  • response_1 = requests.post(url=url_1
  • , data=data_1
  • , headers=header
  • , ).json()
  • for i in response_1['list']:
  • ID_list.append(i['ID']) # 将ID存入列表
  • # 目标详细数据界面url
  • url_2 = "http://scxk.nmpa.gov.cn:81/xk/itownet/portalAction.do?method=getXkzsById"
  • for i in ID_list:
  • data_2 = {
  • id: i
  • # 以id为参数搜索,注意不能ID,要和url_2界面From Data 名一致为小写
  • # 而不是和url_1界面爬去数据的键名一致
  • }
  • response_2 = requests.post(url=url_2
  • , data=data_2
  • , headers=header).json()
  • detail_list.append(response_2)
  • # 结果存储在 detail_list 中
  • #有目的数据存储方式一
  • """
  • fp = open('tail_', mode='w+', encoding='utf-8')
  • for each in detail_list:
  • factoryName = each["epsName"] # 公司名称
  • businessPerson = each["businessPerson"] # 负责人姓名
  • address = each["epsAddress"] # 公司地址
  • json.dump([factoryName, businessPerson, address], fp=fp, ensure_ascii=False)
  • fp.write('\n')
  • fp.close()
  • """
  • #所有数据存储方式二
  • """
  • fp = open('tail_', mode='w+', encoding='utf-8')
  • json.dump(detail_list, fp=fp, ensure_ascii=False)
  • fp.close()
  • """
  • print("爬爬爬over")
百度图片

(这个还是大家自己理解吧)

  • import os
  • import requests
  • page = input('请输入要爬取多少页:')
  • header = {
  • "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36 SLBrowser/7.0.0.5211 SLBChan/25"
  • }
  • url = 'https://image.baidu.com/search/acjson?'
  • n ,pn= 0,1
  • # pn是从第几张图片获取 百度图片下滑时默认一次性显示30张
  • for m in range(1, int(page) + 1):
  • param = {
  • 'tn': 'resultjson_com',
  • 'logid': '8846269338939606587',
  • 'ipn': 'rj',
  • 'ct': '201326592',
  • 'is': '',
  • 'fp': 'result',
  • 'queryWord': '美女',
  • 'cl': '2',
  • 'lm': '-1',
  • 'ie': 'utf-8',
  • 'oe': 'utf-8',
  • 'adpicid': '',
  • 'st': '-1',
  • 'z': '',
  • 'ic': '',
  • 'hd': '',
  • 'latest': '',
  • 'copyright': '',
  • 'word': '美女',
  • 's': '',
  • 'se': '',
  • 'tab': '',
  • 'width': '',
  • 'height': '',
  • 'face': '0',
  • 'istype': '2',
  • 'qc': '',
  • 'nc': '1',
  • 'fr': '',
  • 'expermode': '',
  • 'force': '',
  • 'cg': 'girl',
  • 'pn': pn,
  • 'rn': '30',
  • 'gsm': '1e',
  • }
  • page_text = requests.get(url=url, headers=header, params=param)
  • page_text.encoding = 'utf-8'
  • page_text = page_text.json()
  • data_list = page_text['data']
  • data_list.pop(-1)
  • image_loc_list = []
  • for i in data_list:
  • image_loc_list.append(i['thumbURL'])
  • if not os.path.exists("./图片爬取"):
  • os.mkdir("./图片爬取")
  • for img_path in image_loc_list:
  • img_data = requests.get(url=img_path, headers=header).content
  • img_path = './图片爬取/' + str(n) + '.jpg'
  • fp=open(img_path,"wb")
  • fp.write(img_data)
  • n = n + 1
  • pn += 29
方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门