利用python爬虫爬取百度百科词条

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

摘自 莫烦爬虫教程

选择一个词条,输入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()

爬取结果

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值