网络爬虫基本原理

目录

一.爬虫是什么

二.爬虫的基本流程

三.http与https协议的联系及区别

四.request与Response之间的关系

五.request请求以及常用请求方式

六.Respons响应

七.Robots规范与原则

八.总结


一.爬虫是什么

   互联网是什么?互联网是由一个个站点和网络设备组成的,通过浏览器访问站点,站点把HTML、JS、CSS代码返回给浏览器,这些代码经过浏览器解析、渲染,将丰富多彩的网页呈现我们眼前;

   爬虫指的是:通过程序代码模拟浏览器向网站发起请求,把站点(服务器)返回的HTML代码/JSON数据/二进制数据(图片、视频) 爬取到本地,进而通过解析代码分析并提取自己需要的数据;(若将爬虫比喻为蜘蛛,互联网将是一张蜘蛛网)

 爬虫作用:1.搜索引擎---百度,google,垂直领域搜索引擎;  2.推荐引擎--今日头条;

                   3.机器学习样本; 4.数据分析;等等。

Q1:为什么得到的源代码和浏览器中看到的不一样?何为javaScript渲染页面?
      原因:在浏览器中打开这个页面时,首先会加载这个HTML内容,接着浏览器会发现其中引入了一个app.js文件,然后便会接着去请求这个文件,获取到该文件后,便会执行其中的JavaScript代码,而JavaScript则会改变HTML中的节点,向其添加内容,最后得到完整的页面。                                    在用urllib或requests等库请求当前页面时,我们得到的只是这个HTML代码,它不会帮助我们去继续加载这个 JavaScript 文件,这样也就看不到浏览器中的内容了。
     方法:使用HTTP请求库得到的网页源代码可和浏览器中的页面源代码不太一样。可以分析后台Ajax接口,也可以使用Selenium,Splash这样的库来实现模拟JavaScript渲染。

二.爬虫的基本流程?

用户获取网络数据的方式:浏览器提交请求---->下载网页代码---->解析成页面;

爬虫获取网络数据的方式:模拟浏览器发送请求(获取网页代码)---->提取有用的数据----->存放于数据库或文件中;

 网络爬虫基本原理_第1张图片

1、发起请求

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

2、获取响应内容

如果服务器能正常响应,则会得到一个Response(包含:html,json,图片,视频等);

3、解析内容

解析html数据:正则表达式(re模块)、第三方解析库(xpath,css,Beautifulsoup,pyquery等);

解析json数据:json模块;

解析二进制数据:以wb的方式写入文件;

4、保存数据

数据库(MySQL,Mongdb等);

文件     (Excel等);(利用pandas库将爬取的数据存储在Excel较为方便)

三.http与https协议的原理区别

URI:统一资源标识符;                                                                                                                 URL:统一资源定位符,且为URI的子集;URI强调的是资源,而URL强调的是资源的位置)
URN:只命名资源不指定如何定位资源;

  关系:URI = URL+URN

网站的URL会分为三部分:通信协议、域名地址、资源名称;                                                          通信协议,简单来说就是浏览器和服务器之间沟通的语言。一般就是HTTP协议和HTTPS协议。HTTP协议是一种使用明文数据传输的网络协议,超文本传输协议。存在安全隐患。                HTTPS协议可理解为HTTP协议的升级,就是在HTTP的基础上增加了数据加密SSL层。在数据进行传输之前,对数据进行加密,然后再发送到服务器。

HTTP常用请求类型:

          OPTIONS: 返回服务器针对特定资源所支持的http请求方法。                                                            HEAD: 向服务器索要与get请求相一致的响应,只不过响应体将不会被返回。                              GET: 向特定资源发出请求。                                                                                                        PUT: 向指定资源位置上传其最新内容。                                                                                      POST: 向指定资源提交数据进行处理请求。                                                                                      DELETE: 请求服务器删除指定URI所标识的资源。                                                                            PATCH: 用来将局部修改应用于某一资源。

四.Request与Response之间的关系

     Request:即请求,用户将自己的信息通过浏览器发送给服务器。

     Response:即响应,服务器接收请求,分析用户发来的请求信息,然后返回数据。

注:普通获取网络数据的方式,浏览器在接收Response后,会解析其内容来显示给用户,而爬虫程序在模拟浏览器发送请求然后接收Response后,需要提取其中的有用数据。

五.Request请求以及常用请求方式

请求包括:请求头,请求方法,请求体,请求网址;

1、请求方法:

Requests的Get和POST方法的区别:

   01.get请求中的参数包含在URL里面,数据可以在URL中看到,请求参数params,请求提交的数据最多只有1024字节

   02.post请求的URL不包含这些数据通过表单形式传输,包含在请求体中。请求参数data,请求提交数据没有限制

   03.Requests 是python的很实用的HTTP客户端库;

2、定位request请求中的参数URL(url全球统一资源定位符)

  注:网页的加载过程是:加载一个网页,通常都是先加载document文档。

3、请求头:用来说明服务器要使用的附加信息,一般有cookie,Referer,User-Agent。

User-agent:请求头中如果没有user-agent客户端配置,服务端可能将你当做一个非法用户host;

Accept:         请求报头域,用于指定客户端可以接受那些类型的信息。

cookies:cookie用来保存登录信息,标识服务器信息。

Host:用于指定请求资源的主机IP和端口号,其内容请求URL的原始服务器和网关位置。

Referer:标识这个请求是从那个页面发过来的,服务器可以将此信息做响应的处理,如来源统计,防盗链处理等。

Content-Type:提交数据的方式,叫互联网媒体类型或MIME类型,http协议消息中用来表示具体媒体协议类型。 详细:http://tool.oschina.net/commons请求体一般承载的内容是post请求中的表单数据,而对于GET请求,请求体则为空。

4.常用的请求方式

(1)添加请求头:(请求头以字典的形式生成,然后法送请求中以参数的形式传递并作用的请求中)

代码如下:

headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko)Chrome/53.0.2785.89 Safari/537.36'}

requests.get("https:....",headers=headers)

(2) 使用代理IP:使用IP的使用方法和请求头一致,设置proxies参数即可,代码如下:

import requests

proxies = {"http":"http://10.10.1.10:3128""http":"http://10.10.1.10.1080"}

requests.get("https://....",proxies=proxies)

(3)证书验证:通常设置关闭验证即可。在请求设置参数verify=False时就能关闭证书的验证,默认情况下是True。需要设置证书文件,可在verify值为证书路径;

import requests

url = "https://..."

#关闭证书验证

r = requests.get(url,verify=False)

print(r.status_code)

#开启证书验证

r = requests.get(url,verify=True)

#设置证书所在路径

r = requests.get(url,verify='路径')

(4)超时设置:

requests.get("https://...",timeout=0.01)

requests.post("https://...",timeout=0.01)

(5)使用cookies:只需设置参数Cookies即可;请求头注意携带;

六.Respons响应

     由服务端返回客户端,可分为三部分:

     响应状态码(Response Status Code)+响应头(Response Headers)+响应体(Response Body)

1、响应状态码

  200:代表成功

  301:代表跳转

  404:文件不存在

  403:无权限访问,服务器已理解请求,但拒绝执行;

  502:服务器错误

注:通过F12快捷键检查Response响应元素(JSO数据,如网页html,图片,二进制数据等 )

2.响应头   包含了服务器对请求的应答信息,如Content-Type、Server、Set-Cookie等。

下面简要说明一些常用的头信息。

Date:标识响应产生的时间。

Last-Modified:指定资源的最后修改时间。

Content-Encoding:指定响应内容的编码。

Server:包含服务器的信息,比如名称、版本号等。

Content-Type:文档类型,指定返回的数据类型是什么,如text/html代表返回HTML文档,application/x-javascript则代表返回JavaScript文件,image/jpeg则代表返回图。

Set-Cookie:设置 Cookies。响应头中的 Set-Cookie 告诉浏览器需要将此内容放在 Cookies 中,下次请求携带 Cookies 请求。

Expires:指定响应的过期时间,可以使代理服务器或浏览器将加载的内容更新到缓存中。如果再次访问时,就可以直接从缓存中加载,降低服务器负载,缩短加载时间。

3.响应体   最重要的当属响应体的内容了。

响应的正文数据都在响应体中,比如请求网页时,它的响应体就是网页的HTML代码;请求一张图片时,它的响应体就是图片的二进制数据。我们做爬虫请求网页后,要解析的内容都在响应体中。

七.Robots规范与原则

Robots规范,Robots协议(也称为爬虫协议、机器人协议等)的全称是“网络爬虫排除标准”(Robots Exclusion Protocol),网站通过Robots协议告诉搜索引擎哪些页面可以抓取,哪些页面不能抓取。Robots协议的本质是网站和搜索引擎爬虫的沟通方式,用来指导搜索引擎更好地抓取网站内容,而不是作为搜索引擎之间互相限制和不正当竞争的工具。

详情:robots协议_360百科

八.总结

1、总结爬虫流程:

 代码爬取--->Response解析--->数据存储

(1)将种子URL放入队列

(2)从队列中获取URL,抓取内容。

(3)解析抓取内容,将需要进一步抓取的URL放入工作队列,存储解析后的内容

2、爬虫所需工具:

 请求库:requests;
 解析库:正则,xpath,css,beautifulsoup,pyquery;
 存储库:文件,MySQL,Mongodb等;

3、爬虫框架介绍:

o抓取策略:

       n深度优先  n广度优先  nPageRan  kn大站优先策略

o如何去重:

        nHash表  nbloom过滤器

爬虫基础实例:

例:空气质量排名-xpath-存储于mysql数据库

#xpath方法
import requests
from lxml import html
etree = html.etree
import pymysql

conn = pymysql.connect(host='localhost', user='root', password='admin',
                       db='mysql01', charset='utf8')
# 获取游标(指定获取的数据格式,这里设定返回dict格式)
cursor = conn.cursor()
url = 'http://www.tianqi.com/air/'

headers = {
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36sudaref: graph.qq.com'
}

response = requests.get(url=url,headers=headers)
html = etree.HTML(response.text)
id_list = html.xpath('//div[@class="meta"]/ul/li/@id')[1:]
print(id_list)
# del(id_list[0]) #第0号元素无用,不是目标数据,将其删除

    #建立一个新的列表存放最终数据
print("全国重点城市空气质量指数排行榜\n排名\t城市\t空气质量指数\t质量状况")
for i in range(len(id_list)):
    data = []
    j = id_list[i]
    # print(j)
    result = html.xpath('//div[@class="meta"]/ul/li[@id="%s"]/span/text()'%j)    #获取排名和空气质量指数
    rank = data.append(result[0])
    number_top = data.append(result[1])
    city = data.append(html.xpath('//div[@class="meta"]/ul/li[@id="%s"]/span/a/text()'%j)[0])#获取城市名
    quality = data.append(html.xpath('//div[@class="meta"]/ul/li[@id="%s"]/span/em/text()'%j)[0]) #获取质量状况
    print("%s\t%s\t%s\t%s"%(data[0],data[1],data[2],data[3]))
    # mysql 插入语句(将title和boby插入cnblogs表中)
    sql = 'insert into air value (%s,%s,%s,%s)'
    parm = (data[0],data[1],data[2],data[3])
    # execute(sql,args)args一般是list或tuple格式,如果只有一个参数,可直接传入  execute方法中sql语句占位符是%s
    cursor.execute(sql, parm)
    # 提交数据 conn.commit()
    conn.commit()

你可能感兴趣的:(网络爬虫,python编程,python)