【網絡爬蟲】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

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