爬虫基本介绍

爬虫基本介绍

1、什么是爬虫

#1、什么是互联网?
    互联网是由网络设备(网线,路由器,交换机,防火墙等等)和一台台计算机连接而成,像一张网一样。

#2、互联网建立的目的?
    互联网的核心价值在于数据的共享/传递:数据是存放于一台台计算机上的,而将计算机互联到一起的目的就是为了能够方便彼此之间的数据共享/传递,否则你只能拿U盘去别人的计算机上拷贝数据了。

#3、什么是上网?爬虫要做的是什么?
    我们所谓的上网便是由用户端计算机发送请求给目标计算机,将目标计算机的数据下载到本地的过程。
    #3.1 只不过,用户获取网络数据的方式是:
      浏览器提交请求->下载网页代码->解析/渲染成页面。

    #3.2 而爬虫程序要做的就是:
      模拟浏览器发送请求->下载网页代码->只提取有用的数据->存放于数据库或文件中
 
    #3.1与3.2的区别在于:
      我们的爬虫程序只提取网页代码中对我们有用的数据

#4、总结爬虫
    #4.1 爬虫的比喻:
      如果我们把互联网比作一张大的蜘蛛网,那一台计算机上的数据便是蜘蛛网上的一个猎物,而爬虫程序就是一只小蜘蛛,沿着蜘蛛网抓取自己想要的猎物/数据

    #4.2 爬虫的定义:
      向网站发起请求,获取资源后分析并提取有用数据的程序 

    #4.3 爬虫的价值:
      互联网中最有价值的便是数据,比如天猫商城的商品信息,链家网的租房信息,雪球网的证券投资信息等等,这些数据都代表了各个行业的真金白银,可以说,谁掌握了行业内的第一手数据,谁就成了整个行业的主宰,如果把整个互联网的数据比喻为一座宝藏,那我们的爬虫课程就是来教大家如何来高效地挖掘这些宝藏,掌握了爬虫技能,你就成了所有互联网信息公司幕后的老板,换言之,它们都在免费为你提供有价值的数据。

二 爬虫的基本流程

#1、发起请求
使用http库向目标站点发起请求,即发送一个Request
Request包含:请求头、请求体等

#2、获取响应内容
如果服务器能正常响应,则会得到一个Response
Response包含:html,json,图片,视频等

#3、解析内容
解析html数据:正则表达式,第三方解析库如Beautifulsoup,pyquery等
解析json数据:json模块
解析二进制数据:以b的方式写入文件

#4、保存数据
数据库

三 请求与响应

'''
URL:
    即统一资源定位符,也就是我们说的网址,统一资源定位符是对可以从互联网上得到的资源的位置和访问方法的一种简洁的表示,是互联网上标准资源的地址。
    互联网上的每个文件都有一个唯一的URL,它包含的信息指出文件的位置以及浏览器应该怎么处理它。

URL的格式由三部分组成:
    ①第一部分是协议(或称为服务方式)。
    ②第二部分是存有该资源的主机IP地址(有时也包括端口号)。
    ③第三部分是主机资源的具体地址,如目录和文件名等

http协议:
    https://www.cnblogs.com/kermitjam/p/10432198.html

robots协议: 
    https://www.cnblogs.com/kermitjam/articles/9692568.html

Request:
    用户将自己的信息通过浏览器(socket client)发送给服务器(socket server)

Response:
    服务器接收请求,分析用户发来的请求信息,然后返回数据(返回的数据中可能包含其他链接,如:图片,js,css等)

ps:
  浏览器在接收Response后,会解析其内容来显示给用户,而爬虫程序在模拟浏览器发送请求然后接收Response后,是要提取其中的有用数据。
'''

四 Request

#1、请求方式:
    常用的请求方式:GET,POST
    其他请求方式:HEAD,PUT,DELETE,OPTHONS

    ps:用浏览器演示get与post的区别,(用登录演示post)

    post与get请求最终都会拼接成这种形式:k1=xxx&k2=yyy&k3=zzz
    post请求的参数放在请求体内:
        可用浏览器查看,存放于form data内
    get请求的参数直接放在url后

#2、请求url
    url全称统一资源定位符,如一个网页文档,一张图片
    一个视频等都可以用url唯一来确定

    url编码
    https://www.baidu.com/s?wd=图片
    图片会被编码(看示例代码)


    网页的加载过程是:
    加载一个网页,通常都是先加载document文档,
    在解析document文档的时候,遇到链接,则针对超链接发起下载图片的请求

#3、请求头
    User-agent:请求头中如果没有user-agent客户端配置,
    服务端可能将你当做一个非法用户
    host
    cookies:cookie用来保存登录信息

    一般做爬虫都会加上请求头


#4、请求体
    如果是get方式,请求体没有内容
    如果是post方式,请求体是format data

    ps:
    1、登录窗口,文件上传等,信息都会被附加到请求体内
    2、登录,输入错误的用户名密码,然后提交,就可以看到post,正确登录后页面通常会跳转,无法捕捉到post 

 

Cookie

```
Cookie: "......"
同样是一个比较关键的字段,Cookie是 client 请求 服务器时,服务器会返回一个键值对样的数据给浏览器,下一次浏览器再访问这个域名下的网页时,就需要携带这些键值对数据在 Cookie中,用来跟踪浏览器用户的访问前后路径。 
在爬虫时,我会根据前次访问得到 cookie数据,然后添加到下一次的访问请求头中。
```

- User-Agent

```
中文名用户代理,服务器从此处知道客户端的 操作系统类型和版本,电脑CPU类型,浏览器种类版本,浏览器渲染引擎,等等。这是爬虫当中最最重要的一个请求头参数,所以一定要伪造,甚至多个。如果不进行伪造,而直接使用各种爬虫框架中自定义的user-agent,很容易被封禁。举例:
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Firefox/52.0
User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36
网上有很多的用户代理大全,用户代理大全越多越好,用以伪造多个请求头。
```
- Referer
```
浏览器上次访问的网页url,uri。由于http协议的无记忆性,服务器可从这里了解到客户端访问的前后路径,并做一些判断,如果后一次访问的 url 不能从前一次访问的页面上跳转获得,在一定程度上说明了请求头有可能伪造。 
我在爬虫时,起始入口我会给一个随意的百度搜索地址,然后,在爬取过程中,不断将索引页面的url添加在伪造请求头中。
Referer: https://www.baidu.com/s?wd=%E7%BE%8E%E5%A5%B3&rsv_spt=1&rsv_iqid=0xce19ceff0002f196&issp=1&f=8&rsv_bp=1&rsv_idx=2&ie=utf-8&rqlang=cn&tn=baiduhome_pg&rsv_enter=1&oq=%25E7%25BE%258E%25E5%25A5%25B3&inputT=4&rsv_t=46216vF7O9LH18hEfGKnjaFukwpJdM3UIwrvEb6LkFIXOIsDt2OQf5Ocfy%2F5LJsCTnkJ&rsv_sug3=9&rsv_sug1=6&rsv_sug7=100&rsv_sug2=0&rsv_pq=e4b29f73000184eb&rsv_sug4=596&rsv_sug=1
```

- Accept:
```
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8

指定客户端可以接受的内容类型,比如文本,图片,应用等等,内容的先后排序表示客户端接收的先后次序,每种类型之间用逗号隔开。 
其中,对于每一种内容类型,分号 ; 后面会加一个 q=0.6 这样的 q 值,表示该种类型被客户端喜欢接受的程度,如果没有表示 q=1,数值越高,客户端越喜欢这种类型。 
爬虫的时候,我一般会伪造若干,将想要找的文字,图片放在前面,其他的放在后面,最后一定加上*/*;q=0.8。

比如Accept: image/gif,image/x-xbitmap,image/jpeg,application/x-shockwave-flash,application/vnd.ms-excel,application/vnd.ms-powerpoint,application/msword,*/*

text/xml,text/shtml:文本类型,斜杠后表示文档的类型,xml,或者shtml
application/xml,application/xhtml+xml:应用类型,后面表示文档类型,比如 flash动画,excel表格等等
image/gif,image/x-xbitmap:图片类型,表示接收何种类型的图片
```

- Accept-Language
```
客户端可以接受的语言类型,参数值规范和 accept的很像。一般就接收中文和英文,有其他语言需求自行添加。比如:

Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.6,en;q=0.4
zh-CN:中文简体大陆?
zh:其他中文
en-US:英语美语
en:其他英语

Accept-Language: zh-CN,zh;q=0.9
```

- Accept-Encoding: 
```
客户端接收编码类型,一些网络压缩格式。我看了很多常见的请求头,基本上都不变,就是如下:

Accept-Encoding: gzip, deflate, sdch。相对来说,deflate是一种过时的压缩格式,现在常用的是gzip
```
- Cache-Control
```
Cache-Control: no-cache
指定了服务器和客户端在交互时遵循的缓存机制,即是否要留下缓存页面数据。 
一般在使用浏览器访问时,都会在计算机本地留下缓存页面,相当于是浏览器中的页面保存和下载选项。但是爬虫就是为了从网络上爬取数据,所以几乎不会从缓存中读取数据。所以在设置的时候要侧重从服务器请求数据而非加载缓存。

no-cache:客户端告诉服务器,自己不要读取缓存,要向服务器发起请求
no-store:同时也是响应头的参数,请求和响应都禁止缓存,即不存储
max-age=0:表示当访问过此网页后的多少秒内再次访问,只加载缓存,而不去服务器请求,在爬虫时一般就写0秒
一般爬虫就使用以上几个参数,其他的参数都是接受缓存的,所以就不列出了。

```

- Connection
```
Connection: keep-alive
请求头的 header字段指的是当 client 浏览器和 server 通信时对于长链接如何处理。由于http请求是无记忆性的,长连接指的是在 client 和server 之间建立一个通道,方便两者之间进行多次数据传输,而不用来回传输数据。有 close,keep-alive 等几种赋值,close表示不想建立长连接在操作完成后关闭链接,而keep-alive 表示希望保持畅通来回传输数据。

此外,connection还可以存放一些自定义声明,比如:

Connection: my-header, close
My-Header: xxx
其中,my-header指的是当前访问请求中使用的请求头,close表示数据传输完毕后不保持畅通,关闭链接。

在爬虫时我一般都建立一个长链接。
```


- Host
```
Host:www.baidu.com
访问的服务器主机名,比如百度的 www.baidu.com。这个值在爬虫时可以从 访问的 URI 中获得
```

- Pragma
```
Pragma: no-cache
和 cache-control类似的一个字段,但是具体什么含义我还没有查清楚,一般爬虫时我都写成 no-cache。
```

- Proxy-Connection
```
当使用代理服务器的时候,这个就指明了代理服务器是否使用长链接。但是,数据在从client 到代理服务器,和从代理服务器到被请求的服务器之间如果存在信息差异的话,会造成信息请求不到,但是在大多数情况下,都还是能够成立的。
```

- Accept-Charset
```
指的是规定好服务器处理表单数据所接受的字符集,也就是说,客户端浏览器告诉服务器自己的表单数据的字符集类型,用以正确接收。若没有定义,则默认值为“unknown”。如果服务器没有包含此种字符集,就无法正确接收。一般情况下,在爬虫时我不定义该属性,如果定义,例子如下:
Accept-Charset:gb2312,gbk;q=0.7,utf-8;q=0.7,*;q=0.7
```

- Upgrade-Insecure-Requests
```
自动将不安全的访问请求转换成安全的请求 request。赋值数字1表示可以,0就表示不可以。
```
- Range
```
浏览器告诉 WEB 服务器自己想取对象的哪部分。这个在爬虫时我接触比较少,一般都是爬取整个页面,然后再做分析处理。
```
- If-Modified-Since
```
只有当所请求的内容在指定的日期之后又经过修改才返回它,否则返回304。其目的是为了提高访问效率。但是在爬虫时,不设置这个值,而在增量爬取时才设置一个这样的值,用以更新信息。
```
请求头参数

 

import requests
from urllib.parse import urlencode


headers = {
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
    'Cookie': 'BIDUPSID=129BFA4FF0032F16FF1851332ADFC9E1; PSTM=1521466015; BD_UPN=12314753; MCITY=-154%3A; '
              'BAIDUID=8E87475C1F615023B288E8FEF225AE72:FG=1; '
              'BDUSS=i1SVmoyV2thVFpqMFY4RlpzYmgtQUdJdFI0aW5mY1BnenRGaW5mTmZzNDdzfnRjSVFBQUFBJCQAAAAAAAAAAAEAAADZOm5rYTE1NzM4Mjc4NTgyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADsm1Fw7JtRcV;'
              ' BDORZ=B490B5EBF6F3CD402E515D22BCDA1598; ispeed_lsm=2; delPer=0; BD_CK_SAM=1; BD_HOME=1; H_PS_PSSID=1453_28939_21109_28518_28773_28723_28963_28830_28584; '
              'PSINO=7; COOKIE_SESSION=1647_0_6_6_14_5_0_0_6_2_422_0_0_0_427_0_1557927845_0_1557929065%7C9%230_0_1557929065%7C1; ZD_ENTRY=baidu; sugstore=1',
    'Host': 'www.baidu.com',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36'
}

# data = requests.get('https://www.baidu.com', headers=headers)

data1 = requests.get('https://www.baidu.com/s?' + urlencode({'wd':'美女'}), headers=headers)

print(data1.text)
View Code

五 Response

#1、响应状态
    200:代表成功
    301:代表跳转
    404:文件不存在
    403:权限
    502:服务器错误

#2、Respone header
    set-cookie:可能有多个,是来告诉浏览器,把cookie保存下来
    
#3、preview就是网页源代码
    最主要的部分,包含了请求资源的内容
    如网页html,图片
    二进制数据等

六 总结

#1、总结爬虫流程:
    爬取--->解析--->存储

#2、爬虫所需工具:
    请求库:requests,selenium
    解析库:正则,beautifulsoup,pyquery
    存储库:文件,MySQL,Mongodb,Redis

#3、爬虫常用框架:
    scrapy

 

posted @ 2019-05-16 09:56 Sean_Yang 阅读( ...) 评论( ...) 编辑 收藏
  • 12
    点赞
  • 65
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值