【网络爬虫】BeautfulSoup爬百度百科(真の能看懂~!)

1 百度百科

百度百科中有很多名词的解释信息, 我们今天从 “网页爬虫” 的词条开始爬, 然后在页面中任意寻找下一个词条, 爬过去, 再寻找词条, 继续爬. 看看最后我们爬到的词条和 “网页爬虫” 差别有多大.

在这里插入图片描述

2 观看规律

这个爬虫说实在的, 并不难, 只有20+行代码. 但是却能让它游走在百度百科的知识的海洋中. 首先我们需要定义一个起始网页, 我选择了 “网页爬虫”. 我们发现, 页面中有一些链接, 指向百度百科中的另外一些词条, 比如说下面这样.

<a target="_blank" href="/item/%E8%9C%98%E8%9B%9B/8135707" data-lemmaid="8135707">蜘蛛</a>
<a target="_blank" href="/item/%E8%A0%95%E8%99%AB">蠕虫</a>
<a target="_blank" href="/item/%E9%80%9A%E7%94%A8%E6%90%9C%E7%B4%A2%E5%BC%95%E6%93%8E">通用搜索引擎</a>

通过观察, 我们发现, 链接有些共通之处. 它们都是 /item/ 开头
发现还有一些以 /item/ 开头的, 却不是词条. 比如

<a href="/item/史记·2016?fr=navbar" target="_blank">史记·2016</a>

我想, 我们需要对这些链接做一些筛选, 之前提到 的用 BeautifulSoup正则表达式来筛选应该用得上. 有了些思路, 我们开始写代码吧.

3 制作爬虫

from bs4 import BeautifulSoup
from urllib.request import urlopen
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 = BeautifulSoup(html, features='lxml')

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
        his.pop()

导入一些模块, 设置起始页. 并将 /item/… 的网页都放在 his 中, 做一个备案, 记录我们浏览过的网页.

from bs4 import BeautifulSoup
from urllib.request import urlopen
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 = BeautifulSoup(html, features=‘lxml’)
print(soup.find(‘h1’).get_text(), ’ url: ', his[-1])

#网络爬虫 url: /item/%E7%BD%91%E7%BB%9C%E7%88%AC%E8%99%AB/5162711

接下来我们开始在这个网页上找所有符合要求的 /item/ 网址. 使用一个正则表达式(正则教程) 过滤掉不想要的网址形式. 这样我们找到的网址都是 /item/%xx%xx%xx… 这样的格式了. 之后我们在这些过滤后的网页中随机选一个, 当做下一个要爬的网页. 不过有时候很不幸, 在 sub_urls 中并不能找到合适的网页, 我们就往回跳一个网页, 回到之前的网页中再随机抽一个网页做同样的事.

#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
his.pop()
print(his)

#[’/item/%E7%BD%91%E7%BB%9C%E7%88%AC%E8%99%AB/5162711’, ‘/item/%E4%B8%8B%E8%BD%BD%E8%80%85’]
有了这套体系, 我们就能把它放在一个 for loop 中, 让它在各种不同的网页中跳来跳去.

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
    his.pop()

4 结果

"C:\Program Files\Python36\pythonw.exe" C:/Users/88304/PycharmProjects/untitled13/.idea/math.py
0 网络爬虫     url:  /item/%E7%BD%91%E7%BB%9C%E7%88%AC%E8%99%AB/5162711
1 詹妮弗·劳伦斯     url:  /item/%E5%8A%B3%E4%BC%A6%E6%96%AF
2 玛丽塔     url:  /item/%E7%8E%9B%E4%B8%BD%E5%A1%94
3 义项     url:  /item/%E4%B9%89%E9%A1%B9
4 神雕侠侣     url:  /item/%E7%A5%9E%E9%9B%95%E4%BE%A0%E4%BE%A3
5 耘之     url:  /item/%E5%88%98%E7%99%BB%E7%BF%B0
6 厦门     url:  /item/%E5%8E%A6%E9%97%A8
7 炸五香     url:  /item/%E7%82%B8%E4%BA%94%E9%A6%99
8 荸荠     url:  /item/%E8%8D%B8%E8%8D%A0
9 荸荠属     url:  /item/%E8%8D%B8%E8%8D%A0%E5%B1%9E
10 莎草目     url:  /item/%E8%8E%8E%E8%8D%89%E7%9B%AE
11 植物     url:  /item/%E6%A4%8D%E7%89%A9
12 赤水     url:  /item/%E8%B5%A4%E6%B0%B4
13 踩山节     url:  /item/%E8%B8%A9%E5%B1%B1%E8%8A%82
14 彭水苗族土家族自治县     url:  /item/%E5%BD%AD%E6%B0%B4%E8%8B%97%E6%97%8F%E5%9C%9F%E5%AE%B6%E6%97%8F%E8%87%AA%E6%B2%BB%E5%8E%BF
15 黑叶猴     url:  /item/%E9%BB%91%E5%8F%B6%E7%8C%B4
16 真兽亚纲     url:  /item/%E7%9C%9F%E5%85%BD%E4%BA%9A%E7%BA%B2
17 脊索动物亚门     url:  /item/%E8%84%8A%E6%A4%8E%E5%8A%A8%E7%89%A9%E4%BA%9A%E9%97%A8
18 真兽亚纲     url:  /item/%E7%9C%9F%E5%85%BD%E4%BA%9A%E7%BA%B2
19 带甲目     url:  /item/%E5%B8%A6%E7%94%B2%E7%9B%AE

进程已结束,退出代码0

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章