一、爬虫简介

一、爬虫入门:

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))
posted @ 2023-02-24 20:54  Stitches  阅读(79)  评论(0)    收藏  举报