问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

如何使用python3爬取1000页百度百科条目

发布网友 发布时间:2022-04-23 18:23

我来回答

1个回答

热心网友 时间:2022-05-10 08:34

1 问题描述

起始页面 ython 包含许多指向其他词条的页面。通过页面之间的链接访问1000条百科词条。

对每个词条,获取其标题和简介。

2 讨论

首先获取页面源码,然后解析得到自己要的数据。

这里我们通过urllib或者requests库获取到页面源码,然后通过beautifulsoup解析。

可以看到,标题是在<h1></h1>标签下的。


可以看出,简介是在class为lemma-summary的div下的。


可以看出,其他词条的格式都遵循hcom/item/xxx的形式

3 实现

# coding=utf-8from urllib import requestfrom bs4 import BeautifulSoupimport reimport tracebackimport time

url_new = set()
url_old = set()
start_url = 'httpm/item/python'max_url = 1000def add_url(url):
if len(url_new) + len(url_old) > 1000:        return
if url not in url_old and url not in url_new:
url_new.add(url)def get_url():
url = url_new.pop()
url_old.add(url)    return urldef parse_title_summary(page):
soup = BeautifulSoup(page, 'html.parser')
node = soup.find('h1')
title = node.text
node = soup.find('div', class_='lemma-summary')
summary = node.text    return title, summarydef parse_url(page):
soup = BeautifulSoup(page, 'html.parser')
links = soup.findAll('a', href=re.compile(r'/item/'))
res = set()
keprefix = 'htt.baidu.com'
for i in links:
res.add(keprefix + i['href'])    return resdef write2log(text, name='d:/ke-urllib.log'):
with open(name, 'a+', encoding='utf-8') as fp:
fp.write('\n')
fp.write(text)if __name__ == '__main__':
url_new.add(start_url)    print('working')
time_begin=time.time()
count = 1
while url_new:
url = get_url()        try:
resp = request.urlopen(url)
text = resp.read().decode()
write2log('.'.join(parse_title_summary(text)))
urls = parse_url(text)            for i in urls:
add_url(i)            print(str(count), 'ok')
count += 1
except:
traceback.print_exc()            print(url)
time_end=time.time()    print('time elapsed: ', time_end - time_begin)    print('the end.')

输出结果

working1 ok
略983 ok984 ok
time elapsed:  556.4766345024109the end.

将urllib替换为第三方库requests:

pip install requests

略if __name__ == '__main__':
url_new.add(start_url)    print('working')
time_begin = time.time()
count = 1
while url_new:
url = get_url()        try:            with requests.Session() as s:
resp = s.get(url)
text = resp.content.decode()  # 默认'utf-8'
write2log('.'.join(parse_title_summary(text)))
urls = parse_url(text)            for i in urls:
add_url(i)            print(str(count), 'ok')
count += 1
except:
traceback.print_exc()            print(url)
time_end = time.time()    print('time elapsed: ', time_end - time_begin)    print('the end.')

输出

略986 ok987 ok988 ok989 ok
time elapsed:  492.8088216781616the end.

一个通用的爬虫架构包括如下四部分:

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
大同四区和市区的区别 大同云冈属于哪里 大同市云冈区建成区范围都有哪些 it wasn't long before i found a job.---before是什么意思 It wasn't long before a man from It wasn't long before和It won't be long before有什么区别吗? it wasn't long before和it won't be long before有什么不同?_百度知 ... 微信怎么查和一个好友的红包记录 马龙巴黎奥运会夺冠了吗 明天是中国的情人节??? 内存单通道和双通道士什么意思 我想自己组装一台电脑怎么组装?采纳再追加200悬赏!!! 读词语,按要求分类。 骄阳似火,草木萌生,天寒地冻,清风细雨,鸟语花香,姹紫嫣红,金桂飘香,白雪皑 长春卖品胜电池的地方 挪移 侮辱 姹紫嫣红 昂首挺胸 按字母表顺序构成的词是第几个? 什么时候【星游记】第二季全集啊 按要求写词语:姹紫嫣红:(写三个) 品胜2300毫安、1.2v的镍氢电池两节,如何充电? 威尼斯的小艇按原文填空题 预算1K左右,蓝宝石RX 560XT和华硕GTX 1050TI哪个性价比高 本来想买索泰gtx660雷霆版,但是听说风扇声太大了就放弃了,现在就想换个750ti,我现在是65 将下列汉字,按音序在小火车上重新排队姹,纸,静,封,贴,航 今年一月份买的影驰黑将gtx950显卡转卖能卖多少钱呢,我想850元卖出去,入手的时候是989 GTX1050TI显卡哪个性价比最高 1050ti显卡,哪个最好性价比最高,详细的型号 现在活动gtx1050ti只要989我要买吗? 铝表面怎么清洁? 谁知道铝表面怎么处理的亮一点 铝的表面处理方式有那些?那些是很亮的? 经过抛光的铝材表面要用什么材料来处理,都说要用什么酸之类的,请教知识人 cupi5 6500 显卡七彩虹gtx750ti 如下配置,电脑如何升级 艾弗森个人简历 狐狸雨的歌词 电脑组装机,5000左右配置,求搭配 1.5W-2W的高端台式机 连锁餐饮企业招聘店长的渠道 我想找工作哪里要人,你们找工作一般在哪里看的? ktv招聘店长 店长直聘怎么发布招聘信息? 目前店长招聘员工,使用哪个招聘平台比较好呢? 招聘店长,店员.有工作经验者优先入取,待遇从优. 我在智联招聘上照工作,发现招聘店长的需求人数都是若干个,通常情况店长不是就一个嘛, 我想用店长直聘找工作,用店长直聘找工作靠谱吗? 黄金au9999是什么意思? 现在的黄金有9999的吗? 买黄金看24k还是看9999标准? 国家规定咖啡的糖可以没有保质期吗 咖啡用的方糖可以保存多久? united coffee咖啡糖保质期怎么看