什么是爬虫?
**请求
网站并提取
**数据的 **自动化
**程序
爬虫的基本流程
- 发起请求
- 通过HTTP库向目标站点发起请求,即发送一个Request,请求可以包含额外的headers等信息,等待服务器响应
- 获取响应内容
- 如果服务器能正常响应,会得到一个Response,Response的内容便是索要获取的页面内容,类型可能有HTML,JSON字符串,二进制数据(如图片视频)等类型。
- 解析文本内容
- 得到的内容可能是HTML,可以用正则表达式、网页解析库进行解析。可能是JSON,可以直接转为JSON对象解析。可能是二进制数据,可以做保存或者进一步处理。
- 保存数据
- 保存形式多样,可以保存文本,也可以保存至数据库,或者保存特定格式的文件。
什么是Request和Response?
1. 浏览器发送信息给该网址所在的服务器,这个过程叫做HTTP Request。
2. 服务收到浏览器发送的消息后,能够根据浏览器发送消息的内容,做相应的处理,然后把消息回传给浏览器。这个过程叫做HTTP Response。
3.浏览器收到服务器的Response信息后,会对信息进行相应处理,然后展示。
Request中包含什么?
Request分为4部分
- 请求方法
- GET : 请求中的参数包含在URL 里面,数据可以在URL 中看到,而POST 请求的URL 不会包
含这些数据,数据都是通过表单形式传输的,会包含在请求体中。 - POST: 大多用于提交表单或上传文件,数据包含在请求体中
- PUT:从客户端向服务器传送的数据取代指定文梢中的内容
- HEAD:类似于GET 请求, 只不过返回的响应中没有具体的内容,用于获取报头
- GET : 请求中的参数包含在URL 里面,数据可以在URL 中看到,而POST 请求的URL 不会包
- 请求的网址
- 请求的网址,即统一资惊定位符URL ,它可以唯一确定我们想请求的资源。
- 请求头:
请求头,用来说明服务器要使用的附加信息,比较重要的信息有Cookie 、Referer 、User-Agent 等。 下面简要说明一些常用的头信息
- Accept :请求报头域,用于指定客户端可接受哪些类型的信息。
- Accept-Language :指定客户端可接受的语言类型。
- Accept-Encoding :指定客户端可接受的内容编码。
- Host :用于指定请求资源的主机IP 和端口号,其内容为请求URL 的原始服务器或网关的位
置。从HTTP 1. l 版本开始,请求必须包含此内容。 - Cookie :也常用复数形式Cookies ,这是网站为了辨别用户进行会话跟踪而存储在用户本地
的数据。它的主要功能是维持当前访问会话。 - Referer :此内容用来标识这个请求是从哪个页面发过来的,服务器可以拿到这一信息并做相
应的处理,如做来源统计、防盗链处理等。 - User-Agent :简称UA ,它是一个特殊的字符串头,可以使服务器识别客户使用的操作系统
及版本、浏览器及版本等信息。在做爬虫时加上此信息,可以伪装为浏览器;如果不加,很
可能会被识别州为爬虫。 - Content-Type :也叫互联网媒体类型( Internet Media Type )或者MIME 类型,在HTTP 协议
消息头中,它用来表示具体请求中的媒体类型信息。例如, text/html 代表HTML 格式,
image/gif代表GIF 图片, app lication/json 代表JSON 类型,更多对应关系可以查看此对照表:
http://tool.oschina.neνcommons 。
- 请求体:
请求体-般承载的内容是POST 请求中的表单数据,而对于GET 请求,请求体则为空。
- 此时需要注意Request Headers 中指定Co nte nt-Type 为application, x-www-form-urlencoded 。只有设置
Content-Type 为application/x-www-form-urlencoded ,才会以表单数据的形式提交。另外,我们也可以
将Co ntent-Type 设置为application/ison 来提交JSON 数据,或者设置为mu lti part/form-data 来上传文件
- 此时需要注意Request Headers 中指定Co nte nt-Type 为application, x-www-form-urlencoded 。只有设置
Response 中包含什么?
- 响应状态码
- 响应状态码表示服务器的响应状态,如200 代表服务器正常响应, 404 代表页面未找到, 500 代表
服务器内部发生错误。在爬虫中,我们可以根据状态码来判断服务器响应状态,如状态码为200 ,则
证明成功返回数据, 再进行进一步的处理,否则直接忽略。 - 403 禁止访问 服务将拒绝此请求
- 404 未找到 服务器找不到请求的网页
- 响应状态码表示服务器的响应状态,如200 代表服务器正常响应, 404 代表页面未找到, 500 代表
- 响应头:
响应头包含了服务器对请求的应答信息,如Con tent-Type 、Server 、Set- Co oki e 等。
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
: 指定响应的过期时间, 可以使代理服务器或浏览器将加载的内容更新到缓存巾。如
果再次访问时,就可以直接从缓存中加载, 降低服务器负载,缩短加载时间。
- 响应体:
最重要的当属响应体的内容了。响应的正文数据都在响应体中,比如请求网页时,它的响应体就 是网页的HTML 代码; 请求一张图片时, 它的响应体就是图片的二进制数据。我们做爬虫请求网页后, 要解析的内容就是响应体
- 在浏览器开发者工具中点击Preview ,就可以看到网页的源代码, 也就是响应体的内容,它是解
析的目标。 - 在做爬虫时,我们主要通过响应体得到网页的源代码、JSON 数据等, 然后从中做相应内容的提取。
- 在浏览器开发者工具中点击Preview ,就可以看到网页的源代码, 也就是响应体的内容,它是解
爬虫能抓怎样的数据?
网页文本
:如HTML、JSON格式文本图片
:获取到的是二进制文件,保存为图片格式视频
:保存为视频格式即可其他
:只要是能请求到的,都能获取
怎样来解析数据?
- 直接处理
- JSON解析
- 正则表达式
- Beautiful Soup
- pyQuery
- XPath
为什么我抓到的数据和浏览器看到的不一样?
import requests
response = requests.get('http://m.weibo.com')
print(response.status_code)
with open('res.txt','w',encoding='utf-8') as f:
f.write(response.text)
f.close()
# 输入链接,拿到的只是浏览器数据中的第一个,而其他的数据是通过js发AJAX请求得到的数据,再对DOM进行从新渲染。才是看到的网页数据。
怎样解决js渲染的问题?
- 分享ajax请求
- selenium/webDriver驱动一个浏览器模拟加载网页
- splash
- PyV8、Ghost.py
如何保存数据
- 文本,纯文本、json、xml
- 关系型数据库
- 非关系型数据库
- 二进制文件 ,如图片视频音频等直接保存特定格式即可