一、爬虫简介

    科技2022-07-27  100

    一、爬虫入门:

    1.1 http协议:

    概念: 就是服务器和客户端进行数据交互的一种形式。

    常用的请求头信息:

    User-Agent:当前请求载体的身份标识 (浏览器等信息)Connection:请求完毕后,是断开连接还是保持连接

    常用的响应头信息:

    Content-Type:服务器响应回客户端的数据类型

    Https协议:

    安全的超文本传输协议

    数据加密方式:

    对称密钥加密:客户端将信息数据加密后,同时将密钥和密文发送给客户端非对称密钥加密:服务器端制定加密方式(公钥),然后将公钥发送给客户端;客户端拿到公钥后将数据加密(秘钥),然后将私钥发送给客户端。

    证书密钥加密:

    非对称密钥仍然存在不足,比如秘钥被劫持然后篡改,导致服务器不能正确解析;或者是公钥被劫持,导致客户端进行错误的加密。

    证书秘钥加密加入了证书认证机构,服务器端会首先将产生的公钥发送给证书认证机构,证书认证机构对公钥进行了签名然后转交给客户端,客户端只有在接收到签了名的公钥后才会进行加密。

    1.2 Request模块:

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

    作用:模拟浏览器发送请求

    (1)如何使用[requests模块的编码流程]:

    ① 指定 url;

    ② 发送请求;

    ③ 获取响应数据;

    ④ 持久化存储(响应数据);

    (2) 环境安装:

    打开pycharm的settings中的interpreter,搜索requests下载

    (3)实战编码:

    关于python中使用 with open() as 进行文件读写的操作:

    https://blog.csdn.net/xrinosvip/article/details/82019844

    # 需求:爬取搜狗首页的页面数据 import requests if __name__ == "__main__": #1.指定url url='https://www.sogou.com/' #2.发送请求 response=requests.get(url=url); #3.获取响应的数据 .text返回的是字符串形式的响应数据 page_text=response.text print(page_text) #4.持久化存储 with open("./sogou.html","w",encoding="utf-8") as fp: fp.write(page_text) print("爬取数据结束!")

    1.3 Request模块巩固深入案例(聚焦爬虫):

    (1). 案例一. 网页采集器:

    UA检测:(User-Agent)

    ​ 门户网站的服务器会检测对应请求的身份标识,如果检测到请求的载体身份标识为某一款浏览器,说明该请求是一个正常的请求。但是如果检测到请求的身份标识不是某一款浏览器的,则表示为不正常的亲求(爬虫),则服务器很有可能会拒绝此次请求。

    UA伪装:让爬虫对应的请求载体身份标识伪装成一款浏览器.

    # 制作一个简易的网络请求器 import requests if __name__ == "__main__": # 1.设置请求 url url='https://www.sogou.com/web' value=input('请输入请求的参数:') # 设置请求参数 params={'query':value} # 设置请求头信息---UA伪装 headers={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36'} # 2.发起request请求 responses=requests.get(url=url,params=params,headers=headers) # 3.打印结果数据 page_text=responses.text print(page_text) # 4.持久化数据 fileName=value+'.html' with open(fileName,'w',encoding='utf-8') as fp: fp.write(page_text) print("爬取数据结束!")

    (2). 案例二. 百度翻译破解:

    # requests实战破解百度翻译----json字符格式 import requests import json if __name__ == '__main__': # 1.指定url post_url='https://fanyi.baidu.com/sug' # 2.指定请求数据、UA伪装 params=input('请输入待翻译的数据:') data={ 'kw':params } headers={ 'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36' } responses=requests.post(url=post_url,data=data,headers=headers) # 3.解析responses中的数据为json对象(注意不是字符文件)----只有返回的Content-type是json的才行 dic_obj=responses.json() # 4.持久化存储 fileName=params+'.json' fp=open(fileName,'w',encoding='utf-8') json.dump(obj=dic_obj,fp=fp,ensure_ascii=False) print("爬取结束!")

    有关 json.dump() 的相关知识: https://www.cnblogs.com/autobyme/p/11011451.html

    json.dumps(data,ensure_ascii=False) : 将python数据结构转化为JSON字符串,不使用ascii编码;

    json.loads(json_str) : 将JSON字符串转化为python数据结构;

    json.dump(data,fp,ensure_ascii=False) : 与文件相关,将python对象转化为字符串并且写入文件;

    (3).案例三.爬取豆瓣电影数据:

    # 爬取豆瓣电影数据 import requests import json if __name__ == '__main__': # 1.定义Url url='https://movie.douban.com/j/new_search_subjects' params={ 'sort':'U', 'range':'0,10', 'tags':'', 'start':'40', 'genres':'喜剧' } headers={ 'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36' } # 3.发送request请求 responses=requests.get(url=url,params=params,headers=headers) # 4.存储打印json格式数据 dict_obj=responses.json() # 5.持久化存储 fp=open('./douban_movie.json','w',encoding='utf-8') json.dump(dict_obj,fp,ensure_ascii=False) print('爬取数据完毕!')

    (4).案例四. 爬取坑德基官网数据:

    # 爬取肯德基官网数据 import requests import json if __name__ == "__main__": url='http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=keyword' data={ 'cname':'', 'pid':'', 'keyword':'武汉', 'pageIndex':'1', 'pageSize':'10' } headers={ 'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36' } responses=requests.post(url=url,data=data,headers=headers) page_text=responses.json() print(page_text) fp=open('./kfc.json','w',encoding='utf-8') json.dump(page_text,fp,ensure_ascii=False) print("爬取数据完毕!")

    注意当页面发送请求后但是网址不变时就说明该请求是ajax请求,那么此时就需要关注response的Content-Type。

    (5).案例五. 爬取药品监管局生产许可证数据:

    当通过请求地址栏获取到的数据中不包含某些部分的信息,那么这些数据可能就是 ajax动态请求获取到的。多用抓包工具来分析----

    从首页的ajax请求中获取出企业ID,然后根据每个企业ID到详情页中再次发送ajax请求获取数据。

    如果我们能够批量获取多家企业的ID,就可以将id和url形成一个完整的详情页请求

    # 需求:爬取药物监督管理总局的数据----升级版(可以自由指定页数) import requests import json if __name__ == '__main__': start_page=input('请输入需要爬取的初始页码:') page_numbers=input('请输入需要爬取的页数:') pages=list(range(int(start_page),int(start_page)+int(page_numbers))) # 1.获取ajax请求中各个公司的id url_id='http://scxk.nmpa.gov.cn:81/xk/itownet/portalAction.do?method=getXkzsList' headers={ 'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36' } # 存储公司的ID list_id = [] for page in pages: datas_id={ 'on':'true', 'page':page, 'pageSize':'15', 'productName':'', 'conditionType':'1', 'applyname':'', 'applysn':'' } company_data=requests.post(url=url_id,data=datas_id,headers=headers).json() for id in company_data['list']: list_id.append(id['ID']) # 2.根据ID去发送ajax请求获取每个公司的数据 # 存储公司数据 list_data=[] for id in list_id: url_data='http://scxk.nmpa.gov.cn:81/xk/itownet/portalAction.do?method=getXkzsById' datas={ 'id':id } responses=requests.post(url=url_data,data=datas,headers=headers).json() list_data.append(responses) # 3.数据持久化 fp=open('./medicine.json','w',encoding='utf-8') json.dump(list_data,fp,ensure_ascii=False)

    1.4 Python数据持久化之json数据以json格式写入txt文件:

    json.dumps中indent参数是设置json缩进量的

    举例:

    tmp = { "aaa" : "111", "bbb" : '222' } import json with open("tmp.txt", "w") as fp: fp.write(json.dumps(tmp,indent=4)) json.dump(list_data,fp,ensure_ascii=False) ### 1.4 Python数据持久化之json数据以json格式写入txt文件: json.dumps中indent参数是设置json缩进量的 举例: ```python tmp = { "aaa" : "111", "bbb" : '222' } import json with open("tmp.txt", "w") as fp: fp.write(json.dumps(tmp,indent=4))
    Processed: 0.012, SQL: 8