Python网络爬虫

Python网络爬虫

1.爬虫简介

网页爬取,就是把URL地址中指定的网络资源从网络流中读取出来,保存到本地。

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

2.爬取网页的基础知识-HTTP协议

a.HTTP协议简介

超文本传输协议是一种用于分布式、协作式和超媒体信息系统的应用层协议。HTTP是万维网的数据通信的基础。

HTTP的发展是由蒂姆·伯纳斯-李于1989年在欧洲核子研究组织(CERN)所发起。1999年6月公布的 RFC 2616,定义了HTTP协议中现今广泛使用的一个版本——HTTP 1.1。
2014年12月,互联网工程任务组(IETF)将HTTP/2标准提议递交至IESG进行讨论,于2015年2月17日被批准。 HTTP/2标准于2015年5月以RFC 7540正式发表,取代HTTP 1.1成为HTTP的实现标准。

b.HTTP协议概述

HTTP是一个客户端终端(用户)和服务器端(网站)请求和应答的标准(TCP)。通过使用网页浏览器、网络爬虫或者其它的工具,客户端发起一个HTTP请求到服务器上指定端口(默认端口为80)。我们称这个客户端为用户代理程序(user agent)。应答的服务器上存储着一些资源,比如HTML文件和图像。我们称这个应答服务器为源服务器(origin server)。在用户代理和源服务器中间可能存在多个“中间层”,比如代理服务器、网关或者隧道(tunnel)。

c.HTTP工作过程

HTTP协议采用了请求/响应模型。客户端向服务器发送一个请求报文,请求报文包含请求的方法、URL、协议版本、请求头部和请求数据。服务器以一个状态行作为响应,响应的内容包括协议的版本、成功或者错误代码、服务器信息、响应头部和响应数据。

(1)客户端与服务器建立连接。
(2)发送HTTP请求
(3)服务器接到请求后,给予相应的响应信息。
(4)释放连接TCP连接
(5)客户端接收服务器所返回的信息,浏览器解析并显示网页。

d.爬虫过程

发起请求

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

解析内容

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

获取响应内容

如果服务器能正常响应,会得到一个Response,获得的页面内容有Html,Json字符串,二进制数据(如图片,视频等)

保存数据

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

Request与Response
在这里插入图片描述
(1)浏览器就发送消息给该网址所在的服务器,这个过程叫做HTTP Request。
(2)服务器收到浏览器发送的消息后,能够根据浏览器发送消息的内容,做相应处理,然后把消息回传给浏览器。这个过程叫做HTTP Response。
(3)浏览器收到服务器的Response信息后,会对信息进行相应处理,然后展示。

HTTP1.0 定义了三种请求方法: GET, POST 和 HEAD方法。

HTTP1.1 新增了六种请求方法:OPTIONS、PUT、PATCH、DELETE、TRACE 和 CONNECT 方法。
在这里插入图片描述
GET提交的数据会放在URL之后,也就是请求行里面,以?分割URL和传输数据,参数之间以&相连,如EditBook?name=test1&id=123456.(请求头里面那个content-type做的这种参数形式,后面讲) POST方法是把提交的数据放在HTTP包的请求体中。

GET提交的数据大小有限制(因为浏览器对URL的长度有限制),而POST方法提交的数据没有限制。

所有HTTP响应的第一行都是状态行,依次是当前HTTP版本号,3位数字组成的状态代码,以及描述状态的短语,彼此由空格分隔。
在这里插入图片描述
URL是Uniform Resource Locator的缩写,即统一资源定位系统,也就是网址。

URL 遵守一种标准的语法,它由协议、主机名、域名、端口、路径、以及文件名这六个部分构成。
在这里插入图片描述
3.HTML与JavaScript基础-网页结构

1.网页一般由三部分组成,分别是 HTML(超文本标记语言)、CSS(层叠样式表)和 JScript(活动脚本语言)。

2.HTML是整个网页的结构,相当于整个网站的框架。带“<”、“>”符号的都是属于 HTML 的标签,并且标签都是成对出现的。

3.常见的标签如下:
在这里插入图片描述
4.CSS

CSS 表示样式,<style type="text/css">表示下面引用一个 CSS,在 CSS 中定义了外观。

5.JScript 表示功能。交互的内容和各种特效都在 JScript 中,JScript 描述了网站中的各种功能。

如果用人体来比喻,HTML 是人的骨架,并且定义了人的嘴巴、眼睛、耳朵等要长在哪里。CSS 是人的外观细节,如嘴巴长什么样子,眼睛是双眼皮还是单眼皮,是大眼睛还是小眼睛,皮肤是黑色的还是白色的等。JScript 表示人的技能,例如跳舞、唱歌或者演奏乐器等。

4.爬虫的合法性

每一个网站都有一个名为 robots.txt 的文档,当然也有部分网站没有设定 robots.txt。对于没有设定 robots.txt 的网站可以通过网络爬虫获取没有口令加密的数据,也就是该网站所有页面数据都可以爬取。如果网站有 robots.txt 文档,就要判断是否有禁止访客获取的数据。
在这里插入图片描述
5.爬取网页的urllib库

a.urllib库

Python3.x标准库urllib提供了urllib.request、urllib.response、urllib.parse和urllib.error四个模块,很好地支持了网页内容读取功能。再结合Python字符串方法和正则表达式,可以完成一些简单的网页内容爬取工作,也是理解和使用其他爬虫库的基础。

b.使用urllib库获取网页信息

使用 urllib.request.urlopen()函数可以打开一个网站,读取并打印网页信息。

urllib.urlopen(url, data[, proxies])

urlopen()函数返回response对象

函数的参数url表示远程数据的路径;data表示提交到url的数据;proxies用于设置代理。

response对象的方法

info()方法: 返回一个httplib.HTTPMessage对象。

getcode()方法:返回HTTP状态码。如果是HTTP请求,200表示请求成功完成,404表示网址未找到。

geturl():返回请求的url。

urllib的基本应用

1.读取并显示网页内容

import urllib.request
fp = urllib.request.urlopen(r’http://www.python.org’)
print(fp.read(100)) #读取100个字节
print(fp.read(100).decode()) #使用UTF8进行解码
fp.close() #关闭连接

2.提交网页参数

(1)下面的代码演示了如何使用GET方法读取并显示指定url的内容。

import urllib.request
import urllib.parse
params = urllib.parse.urlencode({‘spam’: 1, ‘eggs’: 2, ‘bacon’: 0})
url = “http://www.musi-cal.com/cgi-bin/query?%s” % params
with urllib.request.urlopen(url) as f:
print(f.read().decode(‘utf-8’))

(2)使用POST方法提交参数并读取指定页面内容。

import urllib.request
import urllib.parse
data = urllib.parse.urlencode({‘spam’: 1, ‘eggs’: 2, ‘bacon’: 0})
data = data.encode(‘ascii’)
with urllib.request.urlopen(“http://requestb.in/xrbl82xr”,
data) as f:
print(f.read().decode(‘utf-8’))

3.使用HTTP代理访问页面

import urllib.request
proxies = {‘http’: ‘http://proxy.example.com:8080/’}
opener = urllib.request.FancyURLopener(proxies)
with opener.open(“http://www.python.org”) as f:
f.read().decode(‘utf-8’)

5.爬取网页的requests库

a.requests库概述

简洁的处理HTTP请求的第三方库,建立在Python的urllib3库基础上,是对urllib3库的再封装。

requests库包括URL获取、HTTP长连接和连接缓存、自动内容解码、文件分块上传、连接超时处理、流数据下载等功能。

b.requests库解析

requests库的requests.get()方法功能是网络爬虫和信息提交

res=requests.get(url[,timeout=n])

该函数返回的网页内容会保存为一个response对象。参数url必须采用HTTP或HTTPS方式访问,可选参数timeout用于设定每次请求超时时间。

requests.get() 返回的response对象代表响应。response对象的主要属性如下。

● statuscode:返回HTTP请求的状态,200表示连接成功,404表示失败。

● text:HTTP响应内容的字符串形式,即url对应的页面内容。

● encoding:HTTP响应内容的编码方式。

● content:HTTP响应内容的二进制形式。

Response对象提供了两个方法。

json():如果HTTP响应内容包含JSON格式数据,则该方法解析JSON数据。

raise_for_status():如果status_code值不是200,则产生异常。

requests基本操作

(1)增加头部并设置访问代理

url = ‘https://api.github.com/some/endpoint’
headers = {‘user-agent’: ‘my-app/0.0.1’}
r = requests.get(url, headers=headers)

(2)访问网页并提交数据

payload = {‘key1’: ‘value1’, ‘key2’: ‘value2’}
r = requests.post(“http://httpbin.org/post”, data=payload)
print(r.text) #查看网页信息,略去输出结果
url = ‘https://api.github.com/some/endpoint’
payload = {‘some’: ‘data’}
r = requests.post(url, json=payload)
print(r.text) #查看网页信息,略去输出结果
print(r.headers) #查看头部信息,略去输出结果
print(r.headers[‘Content-Type’])
application/json; charset=utf-8

print(r.headers[‘Content-Encoding’])
gzip

(3)获取和设置cookies
使用get()方法获取网页信息时cookies属性的用法:

r = requests.get(“http://www.baidu.com/”)
r.cookies #查看cookies
<RequestsCookieJar[Cookie(version=0, name=‘BDORZ’, value=‘27315’, port=None, port_specified=False, domain=’.baidu.com’, domain_specified=True, domain_initial_dot=True, path=’/’, path_specified=True, secure=False, expires=1521533127, discard=False, comment=None, comment_url=None, rest={}, rfc2109=False)]>

使用get()方法获取网页信息时设置cookies参数的用法:

url = ‘http://httpbin.org/cookies’
cookies = dict(cookies_are=‘working’)
r = requests.get(url, cookies=cookies) #设置cookies
print(r.text)
{
“cookies”: {
“cookies_are”: “working”
}
}

6.beautifulsoup4库

1.beautifulsoup4库概述

beautifulsoup4库也称为bs4库或BeautifulSoup库

Python用于网页分析的第三方库,用来快速转换被抓取的网页。

beautifulsoup4将网页转换为一颗DOM树。

beautifulsoup4提供一些简单的方法以及类Python语法来查找、定位、修改一棵转换后的DOM树,还能自动将送进来的文档转换为Unicode编码。

2.beautifulsoup4库的对象

BeautifulSoup将HTML文档转换成一个树形结构,每个结点都是 对象,可以归纳为4种类型:Tag、NavigableString、BeautifulSoup、Comment。

Tag对象,HTML中的一个标签。

NavigableString对象,用于操纵标签内部的文字,标签的string属性返回NavigableString对象

BeautifulSoup对象,表示的是一个文档的全部内容,大部分时候可以把它看作是一个特殊的Tag。

Comment对象,是一个特殊类型的NavigableSting对象,它的内容不包括注释符号。

6.beautifulsoup4库-操作解析文档树

a.遍历文档树

(1)获取直接子结点

contents属性和children属性可以获取Tag的直接子结点。

(2)获取所有有子结点

descendants属性可以对所有Tag的子结点进行递归循环,需要遍历获取其中的内容。

(3)获取结点内容

当标签中不再包含标签,string属性返回标签中的内容;

标签中内嵌唯一标签,那么string属性返回最里面标签的内容;

Tag包含了多个子标签结点,string的输出结果是None。

(4)获取多项内容

strings属性用于获取多个内容,需要遍历获取。

(5)父结点

父结点是当前结点的上级结点,parent属性用于获取父结点。

(6)兄弟结点

兄弟结点可以理解为和本结点处在同一层级的结点,next_sibling属性用于获取当前结点的下一个兄弟结点,previous_sibling则与之相反,如果结点不存在,则返回None。

b.搜索文档树

(1)find_all()方法

搜索当前Tag的所有子结点,语法如下。

find_all(name,attrs,recursive,text,**kwargs)

name:名字为name的标签。

attrs:按照Tag标签属性值检索,采用字典形式。

recursive:如果只想搜索Tag的直接子结点,可以使用参数recursive=False。

text:通过text参数可以搜索文本字符中内容。

limit:限制返回结果的数量。

(2)find()方法

find()方法返回找到的第一个结果。

find(name,attrs,recursive,text)

参数含义与find_all()方法完全相同。

c.用CSS选择器筛选元素

CSS的选择器用于选择网页元素,可以分为标签选择器、类选择器和id选择器三种。

在CSS中,标签名不加任何修饰,类名前面需要加点(.)标识,id名前加#号来标识。

在bs4库中,也可以利用类似的方法来筛选元素,用到的方法是soup.select(),返回类型是列表。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值