目录
一.爬虫是什么
二.爬虫的基本流程
三.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、发起请求
使用http库向目标站点发起请求,即发送一个Request(包含请求头、请求体等);
2、获取响应内容
如果服务器能正常响应,则会得到一个Response(包含:html,json,图片,视频等);
3、解析内容
解析html数据:正则表达式(re模块)、第三方解析库(xpath,css,Beautifulsoup,pyquery等);
解析json数据:json模块;
解析二进制数据:以wb的方式写入文件;
4、保存数据
数据库(MySQL,Mongdb等);
文件 (Excel等);(利用pandas库将爬取的数据存储在Excel较为方便)
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:即响应,服务器接收请求,分析用户发来的请求信息,然后返回数据。
注:普通获取网络数据的方式,浏览器在接收Response后,会解析其内容来显示给用户,而爬虫程序在模拟浏览器发送请求然后接收Response后,需要提取其中的有用数据。
请求包括:请求头,请求方法,请求体,请求网址;
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即可;请求头注意携带;
由服务端返回客户端,可分为三部分:
响应状态码(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 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()