网络爬虫的步骤:
- 通过网络链接获取网页内容(使用requests库)
- 对获得的数据内容进行处理 (使用beautifulsoup4库)
requests库
网络爬虫和信息提交只是requests库能支持的基本功能。
与网页请求相关的函数
函数 | 描述 |
---|---|
get(url[, timeout=n]) | 对应于HTTP的GET方式,获取网页最常用的方法,可以增加timeout=n参数,设定每次请求超时时间为n秒 |
post(url, data={‘key’, ‘value’} | 对应于HTTP的POST方式,其中字典用于传递客户数据 |
delete(url) | 对应于url的DELETE方式 |
head(url) | 对应于HTTP的HEAD方式 |
options(url) | 对应于HTTP的OPTIONS方式 |
put(url, data={‘key’, 'value}) | 对应于HTTP的PUT方式,其中字典用于传递客户数据 |
get()函数是最常用的获取网页的方式,再调用requests.get()函数之后,响应内容将作为一个Response对象返回。Response对象的一些属性可以通过下面的字段获取:
属性 | 描述 |
---|---|
status_code | HTTP请求的返回状态,整数,200表示连接成功,404表示失败 |
text | HTTP响应内容的字符串形式,即url对应的页面内容 |
encoding | HTTP响应内容的编码方式 |
content | HTTP响应内容的二进制形式 |
status_code表示的是请求HTTP之后的状态,在处理返回数据之前首先应该判断状态。如果请求没有被相应,就不应该继续处理数据。text属性是请求的页面内痛,以字符串形式展示。通过对encoding进行赋值可以改变编码方式,从而方便进行汉字或者其他文字种类的输出显示。
Response对象提供的一些方法:
方法 | 描述 |
---|---|
json() | 如果HTTP响应内容包含JSON格式数据,使用这个方法可以解析JSON数据 |
raise_for_status() | 如果不是200,则产生异常 |
raise_for_status()方法在非成功响应后产生异常,也就是说返回的请求状态status_code不是200,这个方法就会产生一个异常,需要使用try-except语句。在接受到响应的时候调用这个方法,就可以避开状态字200以外的各种意外情况。
from bs4 import BeautifulSoup
import requests
def getHTMLText(url):
try:
r = requests.get(url, timeout=30)
r.raise_for_status()
r.encoding='utf-8'
return r.text
except:
return ''
url = 'http://www.baidu.com'
soup = BeautifulSoup(getHTMLText(url)) ##使用BeautifulSoup()函数创建一个BeautifulSoup对象
##该BeautifulSoup对象是一个树形结构,包含HTML页面中的每一个Tag元素,比如<head>等。
##HTML中的主要结构都变成了BeautifulSoup对象的属性,可以直接调用a.b的方式获得。
##b就是HTML中标签的名字。
##BeautifulSoup中常用属性有:head,title,body,p,strings,strpped_strings等
beautifulsoup4
beautifulsoup4库是一个解析和处理HTML和XML的第三方库。
使用requests库获取HTML页面并将其转换成字符串之后,需要进一步解析HTML页面格式,提取有用信息,这需要处理HTML和XML库的函数库。
beautifulsoup4库的最大优点是能根据HTML和XML语法建立解析数,进而高效解析其中的内容。
##中国大学排名爬虫
''''''
'''
1:从网络上获取网页内容
2:分析网页内容并且提取有用数据到恰当的数据结构中
3:利用数据结构展示或进一步处理数据
'''
from bs4 import BeautifulSoup
import requests
allUniv=[] ##存储所有大学数据的二维列表
def getHTMLText(url):
try:
r = requests.get(url, timeout=30) ##使用requests来获取网页内容
r.raise_for_status()#检查返回状态是否正常
r.encoding='utf-8' #转换编码方式,便于显示中文
return r.text
except:
return '' ##如果不能正常获取网页,则返回空字符串
def fillUnivList(soup):
data = soup.find_all('tr') ##在BeautifulSoup对象中找到所有的tr标签,即表示表格
for tr in data:
## singleUniv = [] ##创建空表格
ltd = tr.find_all('td') ##从表格中找到每一列
if len(ltd) == 0:
continue
singleUniv = [] ##调整到这里,可以减少内存浪费
for td in ltd:
singleUniv.append(td.string) ##提取td标签中的信息
allUniv.append(singleUniv)
def printUnivList(num): ##传递的参数表示要打印的学校信息的数量
print("{1:^4}{2:{0}^10}{3:{0}^5}{4:{0}^8}{5:{0}^10}".format(chr(12288),"排名", "学校名称", "省市", "总分", "培养规模"))
for i in range(num):
u = allUniv[i]
print("{1:^4}{2:{0}^10}{3:{0}^5}{4:{0}^8}{5:{0}^10}".format(chr(12288),u[0], u[1], u[2], eval(u[3]), u[6]))
##chr(12288)表示输出中文全角空格
def main(num):
url = 'http://www.zuihaodaxue.cn/zuihaodaxuepaiming2016.html'
html = getHTMLText(url)
soup = BeautifulSoup(html, 'html.parser')
#####soup是一个BeautifulSoup对象
fillUnivList(soup)
printUnivList(num)
main(10)
##自动向搜索引擎提交关键字并显示查询结果
##以百度为例介绍搜索关键字自动提交并获得返回结构的方法
import requests
from bs4 import BeautifulSoup
import re
import json
##根据传递的搜索关键字构建url,并进行查询
def getKeywordResult(keyword):
url = 'http://baidu.com/s?wd=' + keyword
try:
r = requests.get(url, timeout=30)
r.raise_for_status() ##检查返回状态是否是正确的
r.encoding='utf-8'
return r.text
except:
return ''
##对返回的html进行解析
def parserLinks(html):
soup = BeautifulSoup(html, 'html.parser') ##生成一个BeautifulSoup对象
links = []
for div in soup.find_all('div', {'data-tools':re.compile('title')}):
data = div.attrs['data-tools'] ##获得属性值
d = json.loads(data) ##将属性值转换成字典
links.append(d['title']) #将返回链接的题目加入links列表
return links
def main():
html = getKeywordResult('Python语言程序设计基础(第2版)') ##该函数是自己编写的
ls = parserLinks(html)
count = 1
for i in ls:
print('[{:^3}]{}'.format(count, i))
count += 1
main()
这本书中对爬虫的介绍也是最简单的,可以爬取简单的html网页,但是对于动态网页还不知道如何爬取。
因为学Python的主要目的是编写机器学习代码,现在对网络爬虫不做深入研究了!