《Python网络数据采集》阅读笔记 —— 第一章 初见网络爬虫

《Python网络数据采集》阅读笔记

第一部分 创建爬虫

网络爬虫的基本思想:

  • 获取数据
  • 解析数据
  • 存取数据
  • 如果有必要,移动到另一个网页重复这个过程

第一章 初见网络爬虫

一、网络连接

假设Alice 有一台网络服务器,Bob 有一个台式机正准备连接 Alice 的服务器。浏览器获取信息的过程:

  • Bob对Alice发出请求:数据包 = 请求头+消息体
    请求头 包含 本地路由器 MAC 地址和 Alice 的 IP地址;消息体 为 Bob 对 Alice 服务器应用的请求
  • Alice收到数据包,依据请求头进行解析,传递给 网络服务器应用
  • 网络服务器应用用从服务器处理器收到一串数据,数据是这样的:
    ♦ 这是一个 GET 请求
    ♦ 请求文件 index.html
  • 网络服务器应用找到对应的 HTML 文件,把它打包成一个新的数据包发送给 Bob。
from urllib.request import urlopen 
html = urlopen("http://pythonscraping.com/pages/page1.html") 
print(html.read())

这将会输出 http://pythonscraping.com/pages/page1.html 这个网页的全部 HTML 代码:

b'\n\nA Useful Page\n\n\n

An Interesting Title

\n
\nLorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.\n
\n\n\n'

二、BeautifulSoup简介

BeautifulSoup对读取html网页信息进行解析,并提取出任意节点对应标签的内容。

from urllib.request import urlopen 
from bs4 import BeautifulSoup 
html = urlopen("http://www.pythonscraping.com/pages/page1.html") 
bsObj = BeautifulSoup(html.read()) 
print(bsObj.head)
print(bsObj.h1)

输出结果是:


A Useful Page

An Interesting Title

备注:在Chrome浏览器中,可通过F12查看对应网页的html代码

异常情况处理:

  • “HTTPError” 异常:网页在服务器上不存在(或者获取页面的时候出现错误)or 服务器不存在
  • “AttributeError” 异常:想要调用的标签不存在

对应异常处理代码为:

from urllib.request import urlopen
from urllib.error import HTTPError
from bs4 import BeautifulSoup

def getTitle(url):
    try:
        html = urlopen(url)
    except HTTPError as e:
        return None
    try:
        bsObj = BeautifulSoup(html.read(), "lxml")
        title = bsObj.body.h1
    except AttributeError as e:
        return None
    return title

title = getTitle("http://www.pythonscraping.com/pages/page1.html")
if title == None:
    print("Title could not be found")
else:
    print(title)

你可能感兴趣的:(book)