摘自 莫烦爬虫教程
选择一个词条,输入url,随机选择这个词条下的一个子词条,重复这一步直到选择的词条下没有子词条
代码
选定一个初始词条并输入url
## Practice: scrape Baidu Baike
from bs4 import BeautifulSoup
#request 爬取网页工具包
from urllib.request import urlopen
#re 正则化工具包
import re
import random
base_url = "https://baike.baidu.com"
#这里是第一个选取的词条(可以自行更改)
his = ["/item/%E7%BD%91%E7%BB%9C%E7%88%AC%E8%99%AB/5162711"]
抓取网页内容
#拼接成完整网址
url = base_url + his[-1]
#读取并解码汉字
html = urlopen(url).read().decode('utf-8')
#soup 转化为html格式
soup = BeautifulSoup(html, features='lxml')
print(soup.find('h1').get_text(), ' url: ', his[-1])
进入下一级词条并重复抓取操作
# find valid urls
#查找下一级超链接
sub_urls = soup.find_all("a", {"target": "_blank", "href": re.compile("/item/(%.{2})+$")})
if len(sub_urls) != 0:
#从超链接中随机选择一个链接(词条)添加到his列表中
his.append(random.sample(sub_urls, 1)[0]['href'])
else:
# no valid sub link found
his.pop()
print(his)
重复执行这一步操作即可一级一级向下爬取
写一个循环把上述代码整合起来,实现自动爬取
#写成循环形式
his = ["/item/%E7%BD%91%E7%BB%9C%E7%88%AC%E8%99%AB/5162711"]
for i in range(20):
url = base_url + his[-1]
html = urlopen(url).read().decode('utf-8')
soup = BeautifulSoup(html, features='lxml')
print(i, soup.find('h1').get_text(), ' url: ', his[-1])
# find valid urls
#按正则化规则查找词条特征
sub_urls = soup.find_all("a", {"target": "_blank", "href":re.compile("/item/(%.{2})+$")})
#判断当前词条下是否有子词条
if len(sub_urls) != 0:
his.append(random.sample(sub_urls, 1)[0]['href'])
else:
# no valid sub link found
#移除list的最后一项并返回操作后的list
#移除最后一项的原因:如果添加的最后一项(随机选取产生)没有子词条,则一般是跳到了"新建词条"这一项
#通过his列表的输出可以观察到最后一项的输出条件符合正则化标准,但格式跟其他词条有区别,因此将这一项当做无关词条删除
his.pop()
爬取结果

本文介绍了一种使用Python进行网络爬虫的实际应用案例,通过随机选取百度百科词条并递归爬取其子词条的方式,展示了一个简单的爬虫逻辑。代码中运用了BeautifulSoup库解析HTML,urllib库进行网页请求,并结合正则表达式筛选目标链接,实现了自动爬取词条的功能。

5521

被折叠的 条评论
为什么被折叠?



