赞
踩
网络爬虫是用于自动抓取互联网上信息的程序。在Python中,有很多库可以用来编写网络爬虫,其中最基本和常用的是urllib
库。下面我们将对urllib
库进行初步的探索。
一:什么是 urllib ?
urllib 库是 Python 内置的 HTTP 请求库,它 可以看做是处理URL 的组件集合。 模块名称 描述
urllib.request 请求模块
urllib.error 异常处理模块
urllib.parse url 解析模块
urllib.robotparser robots.txt解析模块
首先,我们需要导入urllib
库:import urllib
urllib
库中的urlopen
函数可以用来发送GET请求。以下是一个简单的例子:
response = urllib.request.urlopen('http://www.example.com')
print(response.read())
获取到网页的内容之后,我们需要对HTML进行解析以提取需要的信息。对于复杂的HTML,可以使用BeautifulSoup
库来解析:
from bs4 import BeautifulSoup
import requests
response = requests.get('http://www.example.com')
soup = BeautifulSoup(response.text, 'html.parser')
print(soup.prettify())
二:使用urllib库爬取网页
Python2 中使用的是urllib2 库来下载网页,该库的用法如下所示:
import urllib2
response = urllib2.urlopen('http://www.baidu.com')
注意:
Python3 出现后,之前Python2中的 urllib2 库被移到了urllib.request模块中,之前urllib2中很多函数的路径也发生了变化,希望大家在使用的时候多加注意。
分析 urlopen 方法: urlopen 方法可以接收多个参数,定义格式如下:
urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None, capath=None, cadefault=False, context=None)
参数如下:
url -- 表示目标资源在网站中的位置。
data -- 用来指明向服务器发送请求的额外信息。 timeout 一该参数用于设置超时时间,单位是秒。 context 一 实现 SSL加密传输,该参数很少使用。
使用 HTTPResponse 对象
HTTPResponse 类属于http.client 模块,该 类提供了获取 URL、状态码、响应内容等一 系列方法。
geturl() -- 用于获取响应内容的URL,该方法可以验证发送的 HTTP 请求是否被重新调配。
info() -- 返回页面的元信息。
getcode() -- 返回HTTP 请求的响应状态码。
构造 Request 对象
在构建请求时,除了必须设置的 url 参数外,还可以加入很多内容,例如下面的参数参数如下:
1. data -- 默认为空,该参数表示提交表单数据,同时 HTTP 请求方法将从默认的GET 方式改为 POST 方式。 2. headers -- 默认为空,该参数是一个字典类型,包含了需要发送的 HTTP 报头的键值对。
三:使用urllib实现数据传输
URL 编码转换
解码使用的是url.parse 库的 unquote 方法。
import urllib.parse
result =urllib.parse.unquote('a=%E4%BC%A0%E6%99%B/%E6%92%AD%E5%AE%A2') print(result)
处理GET请求
GET 请求一般用于向服务器获取数据,比如说,我们用百度搜索传智播客。
此时,如果使用Fiddler查看 HTTP 请求,发现有个 GET 请求的格式如下:
https://www.baidu.com/s?wd=%E4%BC%A0%E6%99%BA%E6%92%AD%E5%AE%A2
处理POST请求
当访问有道词典翻译网站进行词语翻译时,会发现不管输入什么内容,其URL一直都是不变的。通过使用 Fiddler观察,发现该网站向服务器 发送的是 POST 请求。当使用有道词典翻译“Python”时,返回的结果是一个JSON 字符串。
四:添加特定 Headers-请求伪装
如果不是从浏览器发出的请求,我们是不能获得响应内容的。针对这种情况,我们需要将爬虫程序发出的请求伪装成一个从浏览器发出的请求。
五:代理服务器
简单的自定义opener
我们可以使用代理服务器,每隔一段时间换一个代理。如果某个IP 被禁止,那么就可以换成其他 IP 继续爬取数据,从而可以有效解决被网站禁止 访问的情况。
简单的自定义 opener
自定义 opener 需要执行下列三个步骤:
1.使用相关的 Handler 处理器创建特定功能的处理器对象 使用自定义的 opener
2. 通过 urllib.request.buildopener()方法使用这些处理器对象创建自定义的 opener 对象
3. 使用自定义的 opener 对象,调用open 方 法发送请求。
注意:如果程序里所有的请求都使用自定义的 opener,可以使用urllib2.install_opener()将自定义的 opener 对象定义为全局opener,表示之后凡是调用urlopen,都将使用自定义的 opener .
六:requests库
抓取静态网页的技术:静态网页是HTML格式的网页,这种网页在浏览器中呈现的内容都会体现在源代码中,此时我们若要抓取静态网页的数据,只需要获得网页的源代码即可。
网络爬虫抓取静态网页数据的过程就是获得网页源代码的过程,这个过程模仿用户通过浏览器访问网页的过程,包括向Web服务器发送HTTP请求、服务器对 HTTP 请求做出响应并返回网页源代码。
发送 GET 请求
在Requests库中,GET 请求通过调用get() 函数发送,该函数会根据传入的URL构建一个请求(每个请求都是Request类的对象),将该请求发送给服务器。get()函数的声明如下:
get(url, params=None, headers=None, cookies=None,
verify=True, proxies=None, timeout=None, **kwargs)
1.url:必选参数,表示请求的URL.
2.params:可选参数,表示请求的查询字符串。
3.headers :可选参数,表示请求的请求头,该参数只支持字典类型的值。
4.cookies :可选参数,表示请求的Cookie信息,该参数支持字典或CookieJar 类对象。5.verify:可选参数,表示是否启用 SSL证书,默认值为True。
6.proxies:可选参数,用于设置代理服务器,该参数只支持字典类型的值。7.timeout :可选参数,表示请求网页时设定的超时时长,以秒为单位。
这段代码首先使用requests
库获取网页内容,然后使用BeautifulSoup
库将内容解析为DOM树,最后打印出树的遍历结果。
我们可以通过选择特定的DOM元素来抓取数据。以下面的例子为例,我们假设网页上有一个表格,我们想要抓取这个表格的数据:
from bs4 import BeautifulSoup
import requests
response = requests.get('http://www.example.com')
soup = BeautifulSoup(response.text, 'html.parser')
table = soup.find('table') # 找到表格元素
rows = table.find_all('tr') # 找到表格中的所有行
for row in rows:
cols = row.find_all('td') # 找到行中的所有单元格
for col in cols:
print(col.text) # 打印单元格的数据
处理响应:在Requests 库中,Response类的对象中封装了服务器返回的响应信息,包括响应头和响应内容等。除了前面介绍的status_code属性之外,Response类中还提供了一些其他属性。
属性 说明
status code 获取服务器返回的状态码
text 获取字符串形式的响应内容
content 获取二进制形式的响应内容
url 获取响应的最终URL
request 获取请求方式
headers 获取响应头
encoding 设置或获取响应内容的编码格式,与text属性搭配使用
cookies 获取服务器返回的Cookies
注意事项:
1.在抓取网页数据时,遵守网站的使用条款和条件,确保你的行为合法且不侵犯他人的权益。
2.频繁地抓取网页数据可能会被视为攻击行为,并可能导致你的IP地址被封禁。因此,请谨慎使用这种方法,并确保你的行为符合相关法律法规。
3.注意网页的更新频率和数据的有效期。有些网页会定期更新数据,因此你需要了解数据的更新周期以便及时获取最新数据。
4.抓取网页数据时可能会遇到网页结构的改变、页面错误或异常情况。因此,建议你在代码中添加异常处理机制以提高程序的鲁棒性。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。