ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

本周复习

2021-09-21 15:35:38  阅读:124  来源: 互联网

标签:浏览器 复习 标签 爬虫 本周 cookie 数据 请求


爬虫本周总结

  • 常见数据收集网络
  • 爬虫理论
  • 网页组成
  • HTML的组成
  • 特殊符号
  • 正则表达式
  • 热模块
  • http协议
  • request模块使用
  • 防爬措置
  • cookie与session
  • 代理池
  • 数据加载方式
  • 爬虫解析库bs4

 

常见数据收集网络

免费类

百度指数:https://index.baidu.com/v2/index.html#/

新浪指数:https://data.weibo.com/index

国家数据:http://www.gov.cn/shuju/index.htm

世界银行:https://data.worldbank.org.cn/

纳斯达克:https://www.nasdaq.com/zh/market-activity

联合国:http://data.un.org/

付费类

  艾瑞咨询:https://www.iresearch.com.cn/

  埃森哲:https://www.accenture.com/cn-zh
  麦肯锡:https://www.mckinsey.com.cn/

     数据堂:https://www.datatang.com/

  贵阳大数据:http://gbdex.bdgstore.cn/

 

网络爬虫理论

1.什么是互联网

  互联网是多台网络设备和终端连结在一起的网路

2.用互联网可干啥

  互联网的用途在于数据的交互,当单个终端想要将其数据传输给里一个终端时,互联网可以使改操作非常便捷和快速,无需通过U盘拷贝,种物理成面上的数据转移来实现

3.什么是上网

  上网就是用户端向目的终端发送请求,请求获取目的终端的数据信息

4.网络爬虫是干什么的

  把互联网比作一张大的蜘蛛网,那一台计算机上的数据便是蜘蛛网上的一个猎物,而爬虫程序就是一只小蜘蛛,沿着蜘蛛网抓取自己想要的猎物/数据

  网络爬虫是跳过网络请求,获取数据并解析之后,保存数据

 

爬虫的分类

1.通用爬虫

  搜索引擎用的爬虫系统

2.搜索引擎如何获取一个网站URL:  

    1.主动向搜索引擎提交网址
      网址收录:https://ziyuan.baidu.com/site/index
    2.在其他网址设置网站外链
    3.与DNS服务商合作(DNS即域名解析技术)

    协议内会指明可以爬取网页的那些部分

    例如:百度快照

'''该协议一般只有大型搜索引擎会遵循'''

3.通用爬虫工作流程  

  爬取网页 存储数据 内容处理 提供检索及排名服务

2.聚焦爬虫

  爬虫程序员写的针对指定内容的爬虫

网页组成

  浏览器请求数据展示的界面其实内部对应就是一堆HTML代码,爬虫程序对这一HTML代码做数据筛选,所以写好爬虫程序的第一步就是熟悉HTML代码基本组成

前端

  任何与用户直接打交道的操作界面都可以称之为"前端"

后端

  程序员编写的不直接与用户打交道的程序代码,一般都是指代程序员编写的代码。

前端三剑客

HTML:网页的骨架
CSS:网页的样式
JavaScript(JS):网页的动态效果

 

HTML基本组成

# 网页文件一般都是以.html结尾

head内常见标签(了解)

# 标签之间可以嵌套

  title 定义网页标签

  style 内部直接书写css代码

  link 引入外部css文件

  script 内部可以直接书写js代码也可以引入外部js文件

  meta 可以刷新网页,也可以定义网页源信息

body内常见标签

双标签有头有尾

<a></a>

单标签(自闭和)

<img/>  

h标签

<h1> - <h6> 标签可定义标题。<h1> 定义最大的标题。<h6> 定义最小的标题。

u下划线

s删除线

i斜体

b加粗

p段落标记

hr分割线

br换行符

特殊符号

&gt :大于号

&lt :小于号

&nbasp:空格符

&amp:&符号

&yen:¥符号

&reg:®注册符号

&copy:©版权符号

常用标签

a链接标签

img图片标签

 div页面布局标签

span页面标签文件

列表标签

 类似于execl表

<ul>
    <li>001</li>
    <li>002</li>
    <li>003</li>
</ul>

 

表格标签

复制代码
<table border=1>
    <thead>
        <tr>
            <th>序号</th>      <!--书写一个个字段名-->
            <th>姓名</th>
            <th>年龄</th>
        </tr>                  <!--一个tr就是一行-->
    </thead>                 <!--书写表头数据(字段名)-->
    <tbody>
        <tr>
            <td>1</td>        <!--书写一个个真实数据-->
            <td>jason</td>
            <td>123</td>
        </tr>
    </tbody>                 <!--书写表单数据(真实数据)-->
</table>
复制代码

input标签

用于网页输入信息,获取用户相关数据

  input的type参数:

  text 普通文本
  password 密文展示
  email 邮箱格式
  date 日期格式
  radio 单选
  checkbox 多选
  file 文件
  submit 提交按钮
  reset 重置按钮
  button 普通按钮

 select标签

列表选择标签

  option子标签

 textarea标签

  获取大文本标签,可以输入文字

标签两大核心属性 

1.id   

  可以单独查找某个人,类似于标签的身份证号码 用于唯一标识标签,在同一个html文档中id不能重复

2.class

  可以批量查找一群人,类似于标签的种群(类别) 用于区分不同的类,在用一个html文档中class值可以重复 表示属于同一个类别

'''
一个标签可以含有多个class值
标签还可以定义任意的属性
'''

 

正则表达式

'''通过特殊符号的组合来筛选出符合条件的文本理解'''
# 正则表达式一门独立的学科,在其他地方都可以单独使用

正则表达式之字符组

复制代码
# 字符组在匹配内容的时候是单个单个字符挨个匹配
    [0123456789]  匹配0到9之间的任意一个数字包括首尾
    [0-9]  简写:匹配0到9之间的任意一个数字包括首尾
    [a-z]  匹配小写字母a到z之间的任意一个字母包括首尾
    [A-Z]  匹配大写字母A到Z之间的任意一个字母包括首尾
    [0-9a-zA-Z]  匹配数字或者小写字母或者大写字母

正则表达式之符号及量词

^ 匹配开头
$ 匹配末尾
() 对数据进行分组,指定查询内容
.  任意字符不包括换行符
\d匹配数字
[...] 匹配字符组中的字符
[^...] 匹配除了字符组中的所有字符

'''量词必须跟在正则表达式后面 不能单独出现使用'''

*          重复零次或更多次
+          重复一次或更多次
?          重复零次或一次
{n}       重复n次
{n,}      重复n次或更多次
{n,m}   重复n到m次

"""正则表达式默认情况下都是贪婪匹配>>>:尽可能多的匹配"""

 

re模块

在python代码中使用正则表达式需要调用内置模块re

1.模块方法findall

  文本数据,在匹配的时候是全局匹配不会匹配到一个就停止

  返回结果为一个列表 内部包含正则匹配到的所有内容

findall分组优先展示

  会优先展示括号内正则表达式匹配到的内容,即先匹配后输出优先内容

取消分组优先展示

# 注意只是取消掉展示优先,并没有取消优先
复制代码
eg:
l='dafadff'
res =re.findall('da|f',l)
print(res)
res =re.findall('d(?:a|f)',l)
print(res)
复制代码

2.模块方法finditer

  文本数据,返回结果为一个迭代器(节省空间),

  主动向其索要才会产生数据,否则永远只占一块空间,可用与大量数据查询时

 3.模块方法search

  匹配到一个符合条件的数据就结束

4.模块方法match

  只能从头开始匹配,头部不符合直接停止

 

爬虫模块request

作用

  可以模拟浏览器向服务器发送请求获取数据,

  缺点:但是不支持js代码

  直系模块:

'''
request-html模块
    是书写requests作者后续开发的 功能比request模块并支持执行js代码
'''

request模块下载

方法1:

打开cmd终端、或者pycharm的terminal输入

pip3 install requests -i 网络地址

-i 用于转换远程仓库,如果网速快可以不用

方法2:

1.点击:file>>>settings

2.Project:....>>>python interpreter>>>点击加号

3.在搜索框输入request,点击install

 

网络请求方法

网络请求方法有八种之多 但是目前需要我们掌握只有两种get和post

 get请求

   简而言之,向服务端获取目的数据

params  # get请求体,具体位置

post请求

  向服务端提交数据

data  # post登录信息请求体

 

http协议

规定浏览器与服务器之间的数据交互关系

四大特性

1.基于请求响应(被动,不接受到请求,是不会发送信息的)

2.基于TCP/IP协议作用于应用层之上的协议

  补充:

  TCP/IP协议:即传输控制/网络协议,是一种面向广域网的通信协议,ip可以增加网络用户数量 

  网络应用层:为应用软件提供了很多服务,例如数据库服务、电子邮件其他网络软件服务。

3.无状态

  不保存客户端的状态,即记不住任何东西

4.无连接

  请求一次回应一次,就断开协议

数据请求格式

  请求数据格式

    请求首行(请求方法、地址...)

    请求头(一大堆K:V键值对)

    空行

    请求体(get请求没有请求体,post请求有,多为敏感信息)

  响应数据格式

    响应首行(响应状态数、地址)

    响应头(K:V键值对)

    空行

    响应体(浏览器展现给用户看的数据)

status code 响应状态码

  用简单简单的数字来表示一串中文意思

  1XX:服务器已接收数据,并正在处理,客户端可以继续提交信息或等待

  2XX:200 服务器成功接收响应

  3XX:重定向(原本访问A页面却跳转B页面)

  4XX:403 请求不符合条件 404 请求资源、网络地址不存在

  5XX:服务器内部出现故障 

 

requests模块使用

发送网络请求

语法:

import requests
# 发送post请求
requests.get(url)
params  # get请求体,具体位置 # 发送post请求 requests.post(url)
data  # post登录信息请求体

携带参数的get请求

语法:

requests.get(url,params={})

 如何携带请求头数据

语法:

requests.get(url,headers={})

 

防爬措施

效验当前请求是否是浏览器发出的

  主要效验的时get请求里User-Agent键值对

  只要请求里面有键值对就表示客户端是个浏览器,反之不是浏览器

解决防爬措施

  在浏览器输入相关命令

  按‘f12’键>>>network>>>相应文件(记住该图标)>>> 查找user-Agent

  将user-agent加入请求头即可

 

cookie与session

http协议特性之一:

  无状态,不保存用户端状态,即记不住

'''早期的网址不需要保存用户状态 所有人来访问都是相同的数据'''

而cookie与session的发明是为了专门解决http协议无状态的特点

现今网站主要用它们保存客户端的信息

cookie:

功能:保存在客户端浏览器上的键值对数据

'''
用户第一次登录成功后 浏览器会保存用户名和密码
之后网站会自动带着用户和密码
'''

session:

保存在服务端上的用户相关数据

'''
用户第一次登录成功后 服务端会返回给客户端一个或多个随机字符串(有时候是多个)
客户端浏览器保存该随机字符串之后访问网站都带着随机字符串
'''

只要涉及到用户登录就需要使用cookie

session需要依赖cookie,因为cookie也存储session信息

浏览器也可以拒绝保存数据

网站登录方法

  用户登录之后,服务端发送给浏览器一个多个随机字符串,浏览器会以cookie大字典形式存储用户登陆的信息和随机字符串等类似于一个身份令牌,之后访问网站时,网站会根据身份令牌核对用户身份,来确定是否可以访问网站。

浏览器功能介绍

Elements     查看页面被浏览器渲染之后的html代码
Console       相对于一个JavaScript编写环境
Sources     以文件目录的形式存放各种资源
Network     监控网络请求
        Fetch/XHR
Application      数据存储相关
        Cookies

模拟代码登录网站的整题逻辑

1.在浏览器登录,获取正确url

2.获取post请求中的用户数据From Data

3.使用post请求模拟登录,post请求体data加入用户数据

4.登录成功后,获取cookie数据

5.携带cookie向网站发送get请求

  stream参数:

  一点一点的取,适用于大文件,比如下载视频时,如果视频100G,用response.content然后一下子写到文件中是不合理的。

# 调用模块
import requests
# 请求模块地址
response=requests.get('https://www.shiping.com/xxx.mp4',
                                 stream=True)
# 打开文件写入
with open('b.mp4','wb') as f:
    # 一行一行读取内容
    for line in response.iter_content():
    # 一行一行
        f.write(line)

  json格式

json格式的数据格式特征:字典内容用刷引号而不是单引号

在网络爬虫领域,许多数据都采用json格式

 

代理池

IP代理池

很多网站针对客户端的IP地址存在防爬措施
  比如一分钟之内同一个IP地址访问该网站的次数不能超过30次,反之就封禁该IP地址
解决措施:
  IP代理池
  寻求多个IP地址,每次访问时从中挑选一个,IP地址可以百度搜索

关键字proxies

  语法

requests.get('网络地址',proxies={'http':'代理IP地址',
                                 'http':'代理IP地址'})      

cookie代理池

很多网站针对客户端的cookie存在防爬措施
  比如一分钟之内同一个cookie的网络访问该网站的次数不能超过30次,反之就封禁该网络地址
解决措施:
  cookie代理池
  寻求多个cookie,每次访问时从中挑选一个

如何获取多个cookie

  这需要注册多个网络账号来获取cookie

关键字cookies

  语法

respone=requests.get('https://www.12306.cn',
                     cookies={})

 

数据加载方式

常见数据加载方式

  向服务页面发送请求,服务页面直接加载出全部数据

"""
如何验证数据是直接加载还是其他方式
    浏览器空白处鼠标右键 点击查看网页源码 在源码界面搜索对应的数据
        如果能收到就表示该数据是直接加载的(你可以直接发送相应请求获取)
"""

内部js代码请求

  向服务页面发送请求,服务页面不直接加载出全部数据,而是向各数据的源地址请求获取数据

'''
查找页面数据来源
需要借助浏览器的network监测对内部请求
  请求数据一般时json格式  
'''

如何判断加载方式

1.在当前数据页面,右键查看网络源代码

2.ctrl+f打开查询框,输入查询数据

3.结果:0/0 是一次或多次js请求

   如果不是,要再次通过network验证

 

爬虫解析库bs4

bs4全名beautiful soup4

  可以从HTML和XML文件中提取数据的Python库,他能够通过个人喜欢的转换器实现惯用的文档导航,查找,修改文档的方式,bs会省数小时甚至数天的工作时间

方法1:

pycharm终端界面或dos界面,如果速度慢,可以加-i改变网络地址

pip3 install beautifulsoup4 -i 网络地址

方法2:

点击file>>>settings>>>项目名>>>interperter>>>加号>>>输入模块名>>>install

 配套解析器下载

  bs4模块也调用了其他解析器,不下载就无法使用,下载方式和上述模块相同

pip3 install lxml

调用模块

from bs4 import BeautifulSoup

构造解析对象

soup =BeautifulSoup(目的变量名, '文件格式')

bs4内置方法

输出从上往下第一个a标签

# soup.标签名

 获取内部标签,包含内部所有的后代标签文本

print(soup.p.text)

 获取标签内部相应的属性的value值

print(soup.p.attrs.get('fog'))

 简写省略attrs参数

print(soup.a.get('href'))

 获取标签内部所有的子标签

语法:
    soup.标签名.children

 获取标签内部所有的子标签

语法:
soup.标签名.contents

 获取标签所有的父标签

语法:
    soup.标签名.parent

获取标签所有的父标签(迭代器)

语法:
    soup.标签名.parents

1.find方法

缺点:只能找到符合条件的第一个,返回结果是一个标签对象

语法:
    soup.find(name='标签名',attrs={'属性':'属性名'})

 2.findall方法

优点:查找所有符合条件的标签 ,返回结果是一个列表

复制代码
语法:
name参数可省略,findall方法与find一致    
soup.findall('标签名')

3.select方法

需要使用CSS选择器,返回一个列表

标签选择器

复制代码
语法:
    soup.select()
'''
1.标签选择器:直接书写标签名即可
2.id选择器:#d1  相当于写了 id='d1'
3.class选择器:.c1  相当于写了 class="c1"
4.儿子选择器(大于号):选择器可以混合使用
    div>p  查找div标签内部所有的儿子p
5.后代选择器(空格):选择器可以混合使用
    div p  查找div标签内部所有的后代p

返回目录

标签:浏览器,复习,标签,爬虫,本周,cookie,数据,请求
来源: https://www.cnblogs.com/20wod/p/15316661.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有