爬虫 + 数据分析 - 1 了解爬虫, 安装Anaxonda, 了解http/https协议, requests

爬虫的概述

什么是爬虫?

通过编写程序让其模拟浏览器上网, 然后去互联网中抓取数据的过程

爬虫的分类

1.普通爬虫:

  抓取整张页面源码内容

2.聚焦爬虫:

  抓取页面中局部的内容

3.增量式爬虫:

  可以检测网站中的数据更新情况.抓取网站中最新更新出来的数据.

反爬机制:
反反爬策略:

爬虫程序通过相应的策略和技术手段,破解门户网站的反爬虫手段,从而爬取到相应的数据。

爬虫的合法性:

爬虫本身是不被法律禁止的(中立性)

爬取数据的违法风险的体现:

  1.爬虫干扰了被访问网站的正常运营.

  2.爬虫抓取了收到法律保护的特定类型的数据或信息.

如何规避违法的风险:

  1.严格遵循网站设置的robots协议

  2.在规避爬虫措施的同时,需要优化自己的代码,避免干扰被访问网站的正常运营

  3.在使用,传播抓取到的信息时,应审查所抓取的内容,如发现属于用户的个人信息,隐私,或其他商业秘密应及时删除停止使用

什么是UA反爬机制,如何破解?
 
如何获取动态加载页面的数据:
如何获取动态加载页面的数据:
  通过抓包工具全局搜索找到动态加载数据对应的数据包,数据包中提取该请求的url,

一.Anaxonda的安装

  1.双击Anaconda3-5.0.0-Windows-x86_64.exe文件

  2.下一步

 

 

 

1.打开cmd窗口,录入jupyter notebook指令,

如果没有显示找不到命令且没有报错即可表示安装成功!

2.在开始菜单中显示

 

 

 

   3.启动

  ① 默认端口启动

 在终端中输入以下命令:

jupyter notebook

执行命令之后,在终端中将会显示一系列notebook的服务器信息,同时浏览器将会自动启动Jupyter Notebook。

启动过程中终端显示内容如下:

$ jupyter notebook
[I 08:58:24.417 NotebookApp] Serving notebooks from local directory: /Users/catherine
[I 08:58:24.417 NotebookApp] 0 active kernels
[I 08:58:24.417 NotebookApp] The Jupyter Notebook is running at: http://localhost:8888/
[I 08:58:24.417 NotebookApp] Use Control-C to stop this server and shut down all kernels (twice to skip confirmation).
  • 注意:之后在Jupyter Notebook的所有操作,都请保持终端不要关闭,因为一旦关闭终端,就会断开与本地服务器的链接,你将无法在Jupyter Notebook中进行其他操作啦。

浏览器地址栏中默认地将会显示:http://localhost:8888。其中,“localhost”指的是本机,“8888”则是端口号。

 

URL

 

如果你同时启动了多个Jupyter Notebook,由于默认端口“8888”被占用,因此地址栏中的数字将从“8888”起,每多启动一个Jupyter Notebook数字就加1,如“8889”、“8890”……

② 指定端口启动

如果你想自定义端口号来启动Jupyter Notebook,可以在终端中输入以下命令:

jupyter notebook --port <port_number> 

其中,“<port_number>”是自定义端口号,直接以数字的形式写在命令当中,数字两边不加尖括号“<>”。如:jupyter notebook --port 9999,即在端口号为“9999”的服务器启动Jupyter Notebook。

③ 启动服务器但不打开浏览器

如果你只是想启动Jupyter Notebook的服务器但不打算立刻进入到主页面,那么就无需立刻启动浏览器。在终端中输入:

jupyter notebook --no-browser

此时,将会在终端显示启动的服务器信息,并在服务器启动之后,显示出打开浏览器页面的链接。当你需要启动浏览器页面时,只需要复制链接,并粘贴在浏览器的地址栏中,轻按回车变转到了你的Jupyter Notebook页面。

 

例图中由于在完成上面内容时我同时启动了多个Jupyter Notebook,因此显示我的“8888”端口号被占用,最终分配给我的是“8889”。

2. 快捷键

  1. 向上插入一个cell:a
  2. 向下插入一个cell:b
  3. 删除cell:x
  4. 将code切换成markdown:m
  5. 将markdown切换成code:y
  6. 运行cell:shift+enter
  7. 查看帮助文档:shift+tab
  8. 自动提示:tab

3. 魔法指令

  1. 运行外部python源文件:%run xxx.py
  2. 计算statement的运行时间:%time statement
  3. 计算statement的平均运行时间:%timeit statement
  4. 测试多行代码的平均运行时间:

    %%timeit

    statement1

    statement2

    statement3

 

二.HTTP 与HTTPS

  1.HTTP协议概念

1.官方概念:

    HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,
是用于从万维网(WWW:World Wide Web )服务器传输超文本到本地浏览器的传送协议。

  2.白话概念:

    HTTP协议就是服务器(Server)和客户端(Client)之间进行数据交互(相互传输数据)的一种形式。

HTTP工作原理

注意事项 

- HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。

    - HTTP是无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,
并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。

    - HTTP是媒体独立的:这意味着,只要客户端和服务器知道如何处理的数据内容,
任何类型的数据都可以通过HTTP发送。客户端以及服务器指定使用适合的MIME-type内容类型。

    - HTTP是无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。
缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。
另一方面,在服务器不需要先前信息时它的应答就较快。

HTTP之URL

HTTP使用统一资源标识符(Uniform Resource Identifiers, URI)来传输数据和建立连接。
URL是一种特殊类型的URI,包含了用于查找某个资源的足够的信息

URL,全称是UniformResourceLocator, 中文叫统一资源定位符,是互联网上用来标识某一处资源的地址。
以下面这个URL为例,介绍下普通URL的各部分组成:http://www.aspxfans.com:8080/news/index.
asp?boardID=5&ID=24618&page=1#name从上面的URL可以看出,一个完整的URL包括以下几部分:

- 协议部分:该URL的协议部分为“http:”,这代表网页使用的是HTTP协议。在Internet中可以使用多种协议,
如HTTP,FTP等等本例中使用的是HTTP协议。在"HTTP"后面的“//”为分隔符

- 域名部分:该URL的域名部分为“www.aspxfans.com”。一个URL中,也可以使用IP地址作为域名使用

- 端口部分:跟在域名后面的是端口,域名和端口之间使用“:”作为分隔符。端口不是一个URL必须的部分,
如果省略端口部分,将采用默认端口

- 虚拟目录部分:从域名后的第一个“/”开始到最后一个“/”为止,是虚拟目录部分。
虚拟目录也不是一个URL必须的部分。本例中的虚拟目录是“/news/- 文件名部分:从域名后的最后一个“/”开始到“?”为止,是文件名部分,如果没有“?”,
则是从域名后的最后一个“/”开始到“#”为止,是文件部分,如果没有“?”和“#”,
那么从域名后的最后一个“/”开始到结束,都是文件名部分。本例中的文件名是“index.asp”。
文件名部分也不是一个URL必须的部分,如果省略该部分,则使用默认的文件名

- 锚部分:从“#”开始到最后,都是锚部分。本例中的锚部分是“name”。锚部分也不是一个URL必须的部分

- 参数部分:从“?”开始到“#”为止之间的部分为参数部分,又称搜索部分、查询部分。
本例中的参数部分为“boardID=5&ID=24618&page=1”。参数可以允许有多个参数,
参数与参数之间用“&”作为分隔符。

HTTP之Request

报文头:常被叫做请求头,请求头中存储的是该请求的一些主要说明(自我介绍)。服务器据此获取客户端的信息。

  常见的请求头:

    accept:浏览器通过这个头告诉服务器,它所支持的数据类型

    Accept-Charset: 浏览器通过这个头告诉服务器,它支持哪种字符集
    Accept-Encoding:浏览器通过这个头告诉服务器,支持的压缩格式
    Accept-Language:浏览器通过这个头告诉服务器,它的语言环境
    Host:浏览器通过这个头告诉服务器,想访问哪台主机
    If-Modified-Since: 浏览器通过这个头告诉服务器,缓存数据的时间
    Referer:浏览器通过这个头告诉服务器,客户机是哪个页面来的 防盗链
    Connection:浏览器通过这个头告诉服务器,请求完后是断开链接还是何持链接
    X-Requested-With: XMLHttpRequest 代表通过ajax方式进行访问

    User-Agent:请求载体的身份标识

 报文体:常被叫做请求体,请求体中存储的是将要传输/发送给服务器的数据信息。

HTTP之Response

 

复制代码
HTTP的响应状态码由5段组成: 

  1xx 消息,一般是告诉客户端,请求已经收到了,正在处理,别急...
  2xx 处理成功,一般表示:请求收悉、我明白你要的、请求已受理、已经处理完成等信息.
  3xx 重定向到其它地方。它让客户端再发起一个请求以完成整个处理。
  4xx 处理发生错误,责任在客户端,如客户端的请求一个不存在的资源,客户端未被授权,禁止访问等。
  5xx 处理发生错误,责任在服务端,如服务端抛出异常,路由出错,HTTP版本不支持等。
复制代码

 

复制代码
相应头:响应的详情展示

  常见的相应头信息:

    Location: 服务器通过这个头,来告诉浏览器跳到哪里
    Server:服务器通过这个头,告诉浏览器服务器的型号
    Content-Encoding:服务器通过这个头,告诉浏览器,数据的压缩格式
    Content-Length: 服务器通过这个头,告诉浏览器回送数据的长度
    Content-Language: 服务器通过这个头,告诉浏览器语言环境
    Content-Type:服务器通过这个头,告诉浏览器回送数据的类型
    Refresh:服务器通过这个头,告诉浏览器定时刷新
    Content-Disposition: 服务器通过这个头,告诉浏览器以下载方式打数据
    Transfer-Encoding:服务器通过这个头,告诉浏览器数据是以分块方式回送的
    Expires: -1 控制浏览器不要缓存
    Cache-Control: no-cache 
    Pragma: no-cache

 相应体:根据客户端指定的请求信息,发送给客户端的指定数据
复制代码

 

  2.HTTPS协议

复制代码
1.官方概念:

    HTTPS (Secure Hypertext Transfer Protocol)安全超文本传输协议,
HTTPS是在HTTP上建立SSL加密层,并对传输数据进行加密,是HTTP协议的安全版。

 2.白话概念:

    加密安全版的HTTP协议。



复制代码

 

   加密技术

  a.对称秘钥加密(SSL)

 

缺点:
  潜在的危险,一旦被窃听,或者信息被挟持,就有可能破解密钥,而破解其中的信息。

 

 

 

 

   b.非对称秘钥加密技术

复制代码
缺点:

  第一个是:如何保证接收端向发送端发出公开秘钥的时候,发送端确保收到的是预先要发送的,
而不会被挟持。只要是发送密钥,就有可能有被挟持的风险。  第二个是:非对称加密的方式效率比较低,它处理起来更为复杂,通信过程中使用就有一定的效率问题而影响通信速度
复制代码

 

   c.证书加密机制

复制代码
 1:服务器的开发者携带公开密钥,向数字证书认证机构提出公开密钥的申请,
数字证书认证机构在认清申请者的身份,审核通过以后,会对开发者申请的公开密钥做数字签名,
然后分配这个已签名的公开密钥,并将密钥放在证书里面,绑定在一起

2:服务器将这份数字证书发送给客户端,因为客户端也认可证书机构,客户端可以通过数字证书
中的数字签名来验证公钥的真伪,来确保服务器传过来的公开密钥是真实的。一般情况下,
证书的数字签名是很难被伪造的,这取决于认证机构的公信力。一旦确认信息无误之后,
客户端就会通过公钥对报文进行加密发送,服务器接收到以后用自己的私钥进行解密。
复制代码

requests模块

下载:pip install requests
作用:就是用来模拟浏览器发起请求。
特点:简单,高效
old:urllib
requests模块的使用流程:   指定url   发起请求(get) - 获取响应对象
  获取响应数据   持久化存储

获取药品企业信息

url:http://125.35.6.84:81/xk/

需求分析:

 

    "#1.检测页面中的数据是否为动态加载\n",
    "#2.通过抓包工具找到动态加载数据对应的数据包,数据包中提取该请求的url\n",
    "#3.发现首页中动态加载的数据包中并没有详情页的url,但是有每一家企业的id\n",
    "#4.通过观察发现,每一家企业详情页的域名是一致的只有携带的id参数不同\n",
    "#5.可以通过相同的域名结合着不同企业的id组成一个企业详情页的url\n",
    "#6.通过抓包工具发现详情页中的企业详情数据是动态加载出来的\n",
    "#7.在抓包工具中通过全局搜索找到了动态加载数据对应的数据包,并且可以提取url\n",
    "#8.多家企业对应的详情数据对应的数据包的url都是一样的,只有携带的参数id的值不同"

 

代码如下:

url = 'http://125.35.6.84:81/xk/itownet/portalAction.do?method=getXkzsList'
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'}
for page in range(1, 11):
    data = {
        "on": "true",
        "page": 1,
        "pageSize": "15",
        "productName": "",
        "conditionType": "1",
        "applyname": "",
        "applysn": "",
    }
    response = requests.post(url=url,headers=headers,data=data).json()['list']
    print('第{}页'.format(page))
#     print(response)
    for dic in response:
        _id = dic['ID']
        data = {
            "id":_id
        }
        url = 'http://125.35.6.84:81/xk/itownet/portalAction.do?method=getXkzsById'
        data = requests.get(url=url,data=data).json()
        name = data['epsName']
        print(name)

 获取肯德基北京地区的商家信息

需求: 前7页

url: http://www.kfc.com.cn/kfccda/index.aspx

分析:

1.分析是否是动态获取数据

2.通过抓包工具找到动态加载数据对应的数据包,数据包中提取该请求的url

代码如下:

import requests
import json
address = input('address')
for i in range(1,8):

    url = 'http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=keyword'
    data = {
        'cname':'',
        'pid':'',
        'keyword': address,
        'pageIndex': i,
        'pageSize': '10',
    }
    headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'}
    response = requests.post(url=url,headers=headers,data=data)
    text = response.text
#     print(text)
    dict = json.loads(text)

    for li in dict['Table1']:
        name = li.get('storeName')
        print(name)
        with open('kfc','a',encoding='utf-8') as f:
            f.write(name+'\n')

 爬取喜马拉雅中的免费音乐

url = 'https://www.ximalaya.com/revision/play/album'
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'}
pagenum = input('pagenum')
param = {
    "albumId": "261506",
    "hasMore": "true",
    "pageNum": str(pagenum),
    "pageSize": "30",
    "sort": "1",
}

data = requests.get(url=url,headers=headers,params=param).json()
# print(data)
music_list = data['data']['tracksAudioPlay']
for mic in music_list:
    music_name = f"{mic['trackName']}.mp3"
    music_url = mic['src']
    music = requests.get(url=music_url,headers=headers).content   #content 获取流数据  text获取文本数据  
    
    with open(music_name,'wb') as f:
        f.write(music)
        print(music_name)

 

转载于:https://www.cnblogs.com/lw1095950124/p/11081318.html

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值