背景简述
最近在听嵩天老师的网络爬虫的网课,仅以此纪录听课内容,供自己复习。
更新:
- 铺设框架 20200801
- 实例1 20200802
Rebots协议
爬虫的规矩,以及如何骗过防爬的小技巧
库的调用
介绍四个常用库,望多多练手,争取熟能生巧。
第三方库:Requests
通过HTTP/HTTPS 协议自动从互联网 获取数据 并向其提交请求的方法
第三方库:BeautifulSoup
从爬取的HTML页面中 解析完整Web信息 的方法(当然想整XML,JSON,YAML的话下载对应的第三方库就好啦)
标准库:Re(正则表达式)
从爬取的HTML页面中 提取关键信息 的方法(搜索关键词用re感觉非常良好)
第三方库Scrapy
通过网络爬虫框架构造专业网络爬虫的基本方法
实例一:大学网站排名:
错误记录
Traceback (most recent call last):
File "C:/Users/lenovo/Desktop/universities.py", line 40, in <module>
main()
File "C:/Users/lenovo/Desktop/universities.py", line 36, in main
fillUnivList(uinfo, html) # 填充数据结构
File "C:/Users/lenovo/Desktop/universities.py", line 18, in fillUnivList
for tr in soup.find('tbody').chidren: # 遍历tbody
TypeError: 'NoneType' object is not iterable
-
最致命:打错了标签的遍历单词:children→chidren ❌
-
其次,一开始的修改编码也打错了
#r.enconding = r.apparent_enconding 错误
#纠正后
r.encoding = r.apparent_encoding
运行效果
我们发现中间列的大学名称对齐效果不好。故对此进一步优化。
系统默认西文字符填充,故我们需要修改字符填充代码,改为中文的 chr(12288)
#修改前
print("{:^10}\t{:^6}\t{:^10}".format("排名", "学校名称", "总分"))
for i in range(num):
u = ulist[i]
print("{:^10}\t{:^6}\t{:^10}".format(u[0], u[1], u[2]))
#修改后
tplt = "{0:^10}\t{1:{3}^10}\t{2:^10}"
# {3}意味在使用填充时我们选用的是format的第三个变量填充,也就是中文填充
print(tplt.format("排名", "学校名称", "分数",chr(12288)))
# 打印表头
for i in range(num):
u = ulist[i]
print(tplt.format(u[0], u[1], u[2],chr(12288)))
正确运行代码
import requests
from bs4 import BeautifulSoup
import bs4
def getHTMLText(url):
try:
r = requests.get(url, timeout=30)
r.raise_for_status() # 返回异常信息
r.encoding = r.apparent_encoding # 修改编码
return r.text
except:
return ""
def fillUnivList(ulist, html): # ulist为构建的数据结构
soup = BeautifulSoup(html, "html.parser")
for tr in soup.find('tbody').chidren: # 遍历tbody
if isinstance(tr, bs4.element.Tag): # 筛出非标签tr
tds = tr('td') # tr标签中的td做查询
ulist.append([tds[0].string, tds[1].string, tds[3].string])
def printUnivList(ulist, num): # num 为你希望列表中多少个元素打印出来
print("{:^10}\t{:^6}\t{:^10}".format("排名", "学校名称", "分数"))
# 打印表头
for i in range(num):
u = ulist[i]
print("{:^10}\t{:^6}\t{:^10}".format(u[0], u[1], u[2]))
def main():
uinfo = [] # 大学数据的列表
url = 'http://www.zuihaodaxue.cn/zuihaodaxuepaiming2016.html'
html = getHTMLText(url) # 提取网页信息
fillUnivList(uinfo, html) # 填充数据结构
printUnivList(uinfo, 20) # 20所
main() #运行主函数