1.爬取网页的步骤
2.爬取网页的代码及显示结果
3.自定义getHTMLText函数代码存在的知识点
4.自定义fillUnivList函数代码存在的知识点
5.自定义printUnivList函数代码存在的知识点
以下内容是看了【Python网络爬虫与信息提取】.MOOC. 北京理工大学 的视频,自己整理并分析的结果。
最近更新:2018-01-15
视频原链接:https://www.bilibili.com/video/av9784617/index_22.html#page=32
1.爬取网页的步骤
- 步骤1:确认是否安装requests库,BeautifulSoup4库;
安装方法参考:Windows系统的cmd,以requests为例,输入:pip install requests - 步骤2:打开软科中国最好大学排名2016网页链接。
http://www.zuihaodaxue.cn/zuihaodaxuepaiming2016.html - 步骤3:在网页右击鼠标右键,选择““查看源代码””,查看代码是否为html代码中,如是则可以用requests,BeautifulSoup4库可以提取相关的信息。如不是,则不可以。
- 步骤4:查看该网站的Robots协议。(该网站无Robots)。
- 步骤5:确认爬取资料的目的,撰写代码,并进行爬取数据。
a)输入:大学排名URL链接;
b)输出:大学排名信息的排名(排名,大学名称,总分);
c)技术路线:requests-bs4;
d)定向爬虫:仅对输入URL进行定向爬取,不扩展爬取。
2.爬取网页的代码及显示结果
2.1爬取网页的代码
#CrawUnivRankingB.py
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):
soup = BeautifulSoup(html, "html.parser")
for tr in soup.find('tbody').children:
if isinstance(tr, bs4.element.Tag):
tds = tr('td')
ulist.append([tds[0].string, tds[1].string, tds[3].string])
def printUnivList(ulist, num):
tplt = "{0:^10}\t{1:{3}^10}\t{2:^10}"
print(tplt.format("排名","学校名称","总分",chr(12288)))
for i in range(num):
u=ulist[i]
print(tplt.format(u[0],u[1],u[2],chr(12288)))
def main():
uinfo = []
url = 'http://www.zuihaodaxue.cn/zuihaodaxuepaiming2016.html'
html = getHTMLText(url)
fillUnivList(uinfo, html)
printUnivList(uinfo, 20) # 20 univs
main()
2.2 代码显示的结果
大学排名.png
3.自定义getHTMLText函数代码存在的知识点
def getHTMLText(url):
try:
r = requests.get(url, timeout=30)
r.raise_for_status()
r.encoding = r.apparent_encoding
return r.text
except:
return ""
3.1自定义getHTMLText函数的理解
从网络上获取大学排名网页内容
3.2 requests.get的理解
r = requests.get(url, timeout=30)
#requests.get(url, params=None,**kwarge)#
timeout设定超时时间,以秒为单位
4.自定义fillUnivList函数代码存在的知识点
def fillUnivList(ulist, html):
soup = BeautifulSoup(html, "html.parser")
for tr in soup.find('tbody').children:
if isinstance(tr, bs4.element.Tag):
tds = tr('td')
ulist.append([tds[0].string, tds[1].string, tds[3].string])
4.1自定义fillUnivList函数的理解
提取网页内容中信息到合适的数据结构
4.2 Beautiful Soup库的解析器是
soup = BeautifulSoup('<html>data</html>','html.parser')
soup = BeautifulSoup(html, "html.parser")
这里的代码中的html是跟解释器中的“标签树”相对应。
4.3 Beautiful Soup标签树的下行遍历
soup.find('tbody').children:
- find()意思是搜索且返回一个结果是字符串类型,同.find_all()参数。
- .childreny意思是字节点迭代类型,与.contents类似,用于循环遍历儿子节点。其他扩展:
.contents子节点的列表,将<tag>所有儿子节点存入列表;
.descendans子节点的迭代类型,包含所有的子孙节点,用于循环遍历。
4.4标签的过滤
if isinstance(tr, bs4.element.Tag):
这里isinstance检测出tbody儿子中的标签类,过滤掉非标签类。
5.自定义printUnivList函数代码存在的知识点
def printUnivList(ulist, num):
tplt = "{0:^10}\t{1:{3}^10}\t{2:^10}"
print(tplt.format("排名","学校名称","总分",chr(12288)))
for i in range(num):
u=ulist[i]
print(tplt.format(u[0],u[1],u[2],chr(12288)))
5.1 自定义printUnivList函数的理解
利用数据结构展示并输出结果 。
5.2 format知识点
tplt = "{0:^10}\t{1:{3}^10}\t{2:^10}"
format知识点
请参考此博文:https://www.jianshu.com/p/e6912942f3f4
5.2解决中文对齐问题
采用中文字符的空格填充 chr(12288)。
网友评论