《Python语言程序设计基础》—— 第 10 章

网络爬虫的步骤:

  • 通过网络链接获取网页内容(使用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方式,其中字典用于传递客户数据

一篇对HTTP的讲解

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元素,比如等。
##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的主要目的是编写机器学习代码,现在对网络爬虫不做深入研究了!

你可能感兴趣的:(python学习)