教材:《Web Scraping with Python——Collecting Data from the Modern Web》© 2015 by Ryan Mitchell
网络数据采集是一种通过多种手段收集网络数据的方式,不光是通过与 API 交互(或者直接与浏览器交互)的方式。最常用的方法是写一个自动化程序向网络服务器请求数据(通常是用 HTML 表单或其他网页文件),然后对数据进行解析,提取需要的信息。
实现一个网络爬虫的基本思路: 1)通过网站域名获取 HTML 数据; 2)解析数据; 3)存储所需要的信息; 4) 如有必要,移动到另一个网页重复此过程。
互联网工作原理——当你在浏览器中输入域名按回车后,发生了什么?
你在浏览器输入的域名,通过DNS服务器将URL中的域名解析为IP地址,这样:
浏览器根据IP地址向web服务器发送HTTP(HyperText Transfer Protocol,超文本传输协议)请求,说“你给我发个网页复本给这个客户”。这个请求,具体怎么传播的,不懂。服务器收到请求后,就同意,给浏览器发了一堆数据包裹(chunks,为什么拆成data chunks进行传输呢?为了无数用户可以在同一时间下载同一网站的数据),浏览器收到后又把包裹裹吧裹吧成一个完整的网页给傻逼客户看。
python用urlib爬取单个网页的所有信息:
from urllib.request import urlopen
#Retrieve HTML string from the URL
html = urlopen("http://www.pythonscraping.com/exercises/exercise1.html")
print(html.read())
用BeautifulSoup实现同样的功能:
from urllib.request import urlopen
from bs4 import BeautifulSoup
html = urlopen("http://www.pythonscraping.com/pages/page1.html")
bsObj= BeautifulSoup(html.read())
print(bsObj)
要想输出特定的数据,直接.属性就可以了。像,要输出一级标题,直接print(bsObj.h1)
还可以实现一些复杂一些的功能,像,单独把网页中的特定的自定义标签的信息抽出来,用findAll()/find():
from urllib.request import urlopen
from bs4 import BeautifulSoup
html = urlopen("http://www.pythonscraping.com/pages/warandpeace.html")
bsObj = BeautifulSoup(html, "html.parser")
nameList = bsObj.findAll("span", {"class":"green"})
for name in nameList:
print(name.get_text())
BeautifulSoup 文档里两者的定义: