- requests主要有两个小的数据请求方式get和post
- 如何在网页上进行分辨呢?
-
1.可以直接在检查界面看到请求方式
2.在检查界面看看是否有From Data数据,若有就是post,没有就是get
栗子: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)
-
- #导库
- 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:User-Agent(请求载体身份标识)
UA检测 : 门户网站的服务器会检测对应请求的载体身份标识,如果载体身份标识为浏览器则正常运行。那么我们的爬虫程序可能会被阻止,那么我们要将爬虫伪装成UA浏览器标识。
在以后爬去网站数据的时候,一般都需要UA伪装,因为大部分浏览器都会进行UA检测。
让我们看看User-Agent在哪吧
注:User-Agent同一个电脑浏览器一般是不变的哈
有了User-Agent,我们就能把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来解析数据
在进行阿贾克斯请求时网址是不变的啊!!!
在进行阿贾克斯请求时网址是不变的啊!!!
在进行阿贾克斯请求时网址是不变的啊!!!
注意:一定要先打开检查,后输入翻译内容!!!
因为name下有许多个目录,我们要挨个寻找 from date为我们输入的数据的Name,即sug,同时要注意response的内容是否为我们需要的。
- 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")
-
- 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
什么玩意儿这一堆东西玩我呢???我只想要排名,什么都不要。
那么----------展开第一个object,哇哇哇!!!
- 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~~~
网址:
来喽!!!进局子喽。。。。
先看看界面
我们的目的爬取所有企业的详细数据信息,是不是感觉直接拿到网址就可以了???你太天真了!!!
来我替你试试
- 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")
-
也许你会得到:
打开后:
神马鬼???
来,试试这个方法!!!
点View就会看到想要的结果:
然后再把它粘贴到文件中
打开后
突然感觉自己的电脑卡了一样。但是不要慌,你再等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中看看:
好了!!!数据位置已经定位完成。
正片开始了!!!
先让我们对于以上分析过程做一个整体的概括。
主页面参数
详细页面参数
- 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
-
-