爬虫基本原理

爬虫定义

请求网站并提取数据的自动化程序

爬虫的基本流程

1、发起请求:通过http库向目标站点发起请求,即发送一个Request,请求可以包含额外的headers等信息,等待服务器响应

2、获取响应内容:如果服务器能正常响应,会得到一个Response,Response的内容便是所要获取的页面内容,类型可能有html,json字符串,二进制数据(如图片视频)等类型

3、 解析内容:得到的内容可能是html,可以用正则表达式,网页解析库进行解析,可能是json,可以直接转为json对象进行解析,可能是二进制数据,可以做保存或者进一步的处理

4、保存数据:保存形式多样,可以存为文本,也可以保存至数据库,或者保存特定格式的文件

Request和Response

1、浏览器发送消息给该网址所在的服务器,这个过程叫做HTTP Request。

2、服务器收到浏览器发送额消息后,能够根据浏览器发送消息的内容,做相应处理,然后把消息回传给浏览器,这个过程叫做HTTP Response。

3、浏览器收到服务器的Response信息后,会对信息进行相应处理,然后展示出来。

上述就是request和response的一个流程。

Request中包含的内容

 1、请求方式

主要有get,post两种类型,另外还有head,put,delete,options等

get请求的一些参数全都包含在网址里面

post请求的参数没有在url中,get直接输入网址即可,post需要构造一个表单(如账号登陆等)

2、请求url

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

3、请求头

包含请求时的头部信息(键值对的形式),如user-agent(服务器会根据这个信息识别是什么样的浏览器,有时候不加user-agent,服务器就会判断为非法信息,可能就不会返回响应),host,cookies等信息

一般做爬虫的时候会加上这个RequestHeaders,以保证我们的请求可以正常运行

4、请求体

请求时额外携带的数据,如表单提交时的表单数据等

一般来说get方式时,不会携带任何内容,post方式时,请求体会包含一些内容

Reponse中包含的内容

1、响应状态

有多种响应状态,如200代表成功,301跳转,404找不到页面,502服务器错误

2、响应头

如内容类型,内容长度,服务器信息,设置cookie等等

3、响应体

最主要的部分,包含额请求资源的内容,如网页html,图片二进制数据等

在做爬虫的时候,通过请求库向服务区发送一个请求,得到响应,通过过解析库进行解析,获得想要的数据

#!/usr/bin/env python
# -*- coding:utf-8 -*-

import requests
response = requests.get('http://www.baidu.com')
print(response)
print(response.text)

输出结果为:

print(response)返回请求的状态码

print(response.text)返回请求体的内容(网页源代码) 

响应除了响应体还有状态码和响应头

print(response.headers),打印响应头

print(response.status_code),打印响应状态码

在上面的请求过程中,没有传递请求头,下面加上请求头

#!/usr/bin/env python
# -*- coding:utf-8 -*-

import requests
headers = {
   'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36 Edge/17.17134'}
response = requests.get('http://www.baidu.com',headers = headers)
print(response)
print(response.text)
print(response.headers)
print(response.status_code)

爬虫可以抓取什么样的数据

1、网页文本

如html文档,Json格式文本等

2、图片

获取到的是二进制文件,保存为图片格式

import requests

response = requests.get('https://sp1.baidu.com/5b1ZeDe5KgQFm2e88IuM_a/wb.gif?type=3&fm=flow_monitor&data=[{}]&q=ͼƬ&qid=b2fbcee5000379bd&rsv_did=9d9d61fd41713df8088b4a20c03b3fd8&rsv_tn=baidu&rsv_sid=26525_1441_21106_26350_26432_26578_22157&t=1528443263126')
print(response.content)
with open('picture.jpeg','wb') as f:
    f.write(response.content)

request.get()中的内容是一个图片的url

rsponse.content与text不一样,content是获取二进制内容

最后将获取到的二进制数据写入文件,保存为图片格式即可

3、视频

同为二进制文件,保存为视频格式即可

与图片操作一样

4、其他

只要是能请求到的,都能获取

解析方式

1、直接处理

比如网页比较简单,返回的内容也简单,就一个字符串,就相当于对字符串做处理了

2、Json解析

有些网页的数据是通过ajax来加载的,这种返回的通常是一些json格式的字符串

3、正则表达式

应用比较普遍

4、BeautifulSoup

比正则表达式更方便,提取更容易

5、其他的解析库,如PyQuery,XPath等

 为什么抓到的数据和浏览器中看到的不一样

我们拿到的是后台请求的源代码,跟渲染之后的网页源代码是不一样的

一个在network中,一个在elements中

如何解决JavaScript渲染的问题

1、分析Ajax请求

2、用Selenium或WebDriver驱动一个浏览器来加载一个网页

from selenium import webdriver

driver = webdriver.Chrome()
driver.get('http://www.baidu.com')

 使用driver.pagesource就可以查看网页的源代码了,不用担心javascri渲染的问题了

3、splash

跟selenium一样,也是来模拟javascript渲染的

4、PyV8,Ghost.py等库来模拟加载

怎样保存数据

1、保存为文本形式

纯文本,Json,XML等

2、关系型数据库

如MySQL,Oracle,SQL Server等具有结构化表结构形式存储

3、非关系型数据库

如MongoDB,Redis等key-value形式存储

4、二进制文件

如图片、视频、音频等等直接保存成特定格式即可

posted @ 2018-06-08 13:48  RongHe  阅读(309)  评论(0编辑  收藏  举报