名词解释:
1.1网络爬虫概述
网络爬虫,即web spider。网络蜘蛛是通过网页链接的地址来寻找网页。
1.2 超文本和html
一个典型的HTTP请求过程如下:
(1)用户在浏览器中输入网址,比如http://dblab.xmu.edu.cn,浏览器向网页服务器发起请求; (2)网页服务器接收用户访问请求,处理请求,产生响应(即把处理结果以HTML形式返回给浏览器)
(3)浏览器接收来自网页服务器的HTML内容,进行渲染以后展示给用户。
1.3 网络爬虫的原理
爬虫就是发送请求获取网站内容并从中提取数据的自动化程序。其中请求,提取,自动化是爬虫的关键,网络爬虫的基本流程如图:
程序填空题
2.1 PYTHON实现HTTP网络请求
python实现http网络请求的常见三种三种方式:urllib,urllib3和requests库
1.urllib是python中一个最基本的网络请求库,可以模拟浏览器的行为,向指定的服务器发送一个请求,并可以保存服务器返回的数据。
在Python3的urllib库中,所有和网络请求相关的方法,都被集中到urllib.request模块下
(1)urlopen函数
urllib.request.urlopen()函数用于实现对目标url的访问。
urllib.request.urlopen(url,data=None,[timeout,]*,
cafile=None, capath=None, cadefault=False,context=None)
url 参数:目标资源在网路中的位置。可以是一个表示URL的字符串(如:http://www.pythontab.com/)。
data参数:data用来指明发往服务器请求中的额外的参数信息(如:在线翻译,在线答题等提交的内容),data默认是None,此时以GET方式发送请求;当用户给出data参数的时候,改为POST方式发送请求。
timeout:设置网站的访问超时时间
cafile、capath、cadefault 参数:用于实现可信任的CA证书的HTTP请求。(基本上很少用)
context参数:实现SSL加密传输。(基本上很少用)
(2)返回处理方法详解
urlopen返回对象提供方法:
1)read() , readline() ,readlines() , fileno() , close() :对HTTPResponse类型数据进行操作
2)info():返回HTTPMessage对象,表示远程服务器返回的头信息
3)getcode():返回Http状态码。如果是http请求,200代码表示请求成功完成;404代码表示网址未找到。
4)geturl():返回请求的url
【例】利用urllib通过urlopen方式读取百度首页。
#导入模块
from urllib import request
#打开指定需要爬取的网页
resp = request.urlopen('http://www.baidu.com')
#读取网页代码,并输出
print(resp.read())
有些网络爬虫的请求可能因为网络原因无法得到响应。因此,我们可以手动设置超时时间。当请求超时后,可以采取进一步措施,例如选择直接丢弃该请求或者再重新请求一次。
2.2传递参数
(1)传递URL参数
import urllib.request
import urllib.pa
params = urllib.parse.urlencode({'q': 'urllib', 'check_keywords': 'yes', 'area': 'default'})
url = "HTTP://docs.python.org/3/search.html?{}".format(params)
r = urllib.request.urlopen(url)
print(r.read())
(2)传递中文参数
2.3 请求headers处理
出现403错误,是因为部分网站设置了反爬虫设置,可以通过模拟浏览器的头部信息来进行访问。
2.4 传递POST请求
3.1 HTML解析之Beautifulsoup
BeautifulSoup是—个用于从HTML和XML文件中提取数据的Python库。BeautifulSoup提供一些简单的、函数用来处理导航、搜索、修改分析树等功能。
1.Beautifulsoup的使用
(1)导入bs4库,然后创建一个模拟html代码的字符串
3.2 四大对象种类
Beautifulsoup将复杂的HTML文档转换成了一个复杂的树形结构,每个节点都是一个python对象,,所有对象可以归纳为四种:Tag,NavigableString,BeautifulSoup,Comment。Tag就是html的一个个标签。
3.2.1 Tag对象
代码的注释部分即为运行成果:
soup.a soup,p重点理解记忆
可以利用soup加标签名轻松获取这些标签的内容
下面哪里验证一下这些标签的内容
print type(soup.a)
#
对于Tag,他有两个重要的属性attrs和name
print soup.nameprint soup.head.name
#[document]#head
在这里,把p标签的所有属性打印输出了出来,得到的类型是一个字典。
如果想要单独获取某个属性,可以这样来做,例如获取它的 class。
还可以使用get方法传入属性的名称来获取
3.2.2 NavigableString对象
不仅可以得到标签的内容,而且还可以通过“.string”获取标签内部的文字。
这样就轻松获取到了标签里面的内容,下面来检查一下它的类型。
3.2.3 Beautifulsoup对象
BeautifulSoup对象表示的是一个文档的全部内容,大部分时候,可以把它当作一个特殊的Tag对象,可以分别获取它的类型,名称和属性。
3.2.4 comment 对象
Comment对象是一个特殊类型的NavigableString对象,其实输出的内容仍然不包括注释符号,但是如果不好好处理它,可能会对文本处理造成意想不到的麻烦。下面来查找一个带注释的标签。
node:
print soup.a print soup.a.string print type(soup.a.string) |
running result: