爬蟲入門--糗百

本文目標:

掌握爬蟲的基本概念
Requests 及 Beautiful Soup 兩個 Python 庫的基本使用
通過以上知識完成糗百段子抓取
https://zhuanlan.zhihu.com/p/73742321

1.爬蟲基本概念

爬蟲也稱網頁蜘蛛,主要用於抓取網頁上的特定信息。這在我們需要獲取一些信息時非常有用,比如我們可以批量到美圖網站下載圖片,批量下載段子。省去手工操作的大量時間。爬蟲程序一般是通過模擬瀏覽器對相應URL發出請求,獲取數據,並通過正則等手段匹配出頁面中我們所需的數據。

在學習爬蟲之前,最好到 w3school 去了解一下 HTML 標籤的概念以及基本的 CSS 的概念。這會讓我們更容易的理解如何獲取頁面中某個內容。

2.Requests 庫基本介紹

Requests 是學習爬蟲的一大利器。是一個優雅簡單的 HTTP庫。官網介紹如下:
Requests: HTTP for Humans

專門爲人類使用的 HTTP 庫。使用起來非常簡單明瞭。
我們平時瀏覽網頁的步驟是輸入網址,打開。在 Requests 中是如下這樣的,我們可以在 Python 交互式解釋器中輸入以下代碼:

import requests
r = requests.get('https://www.qiushibaike.com/text/') 
# 打開網址,一般我們會設置 請求頭,來更逼真的模擬瀏覽器,下文有介紹
print(r.text)

在這裏插入圖片描述
運行後我們就會看到下面一堆的代碼,其實就是網頁的源代碼(也可以在瀏覽器上右鍵查看頁面源代碼)。通過這幾行代碼我們就拿到了頁面的所有信息,剩下的就是從頁面中找到我們所需要的信息。

3.Beautiful Soup 庫介紹

拿到網頁信息後,我們要解析頁面,通常來說我們有以下幾種方式來解析頁面,獲取我們所需的信息。

  1. 正則表達式
    適用於簡單數據的匹配,如果匹配內容較複雜,正則表達式寫起來會很繞,同時頁面內容稍微變化,正則就會失效

  2. Lxml
    Lxml 是專門用來解析 XML 格式文件的庫,該模塊用 C 語言編寫,解析速度很快,和正則表達式速度差不多,但是提供了 XPath 和 CSS 選擇器等定位元素的方法

  3. Beautiful Soup
    這是一個 Python 實現的解析庫,相比較於前兩種來說,語法會更簡單明瞭一點,文檔也比較詳細。唯一的一點就是運行速度比前兩種方式慢幾倍,當數據量非常大時相差會更多。

本文作爲入門教程,就從 Beautiful Soup 入手,來學習一下匹配頁面所需元素的方法。
假如有以下 HTML 內容 example.html

html>
<head>
   <meta charset="utf-8" />
   <meta http-equiv="X-UA-Compatible" content="IE=edge">
   <title>Page Title</title>
</head>
<body>
   <div class='main-page'>
       <ul class='menu-list'>
               <li>首頁</li>
               <li>新聞</li>
               <li>影視</li>
       </ul>
   </div>
</body>
</html>

我們通過 Beautiful Soup 來解析這個html. 首先我們
pip install beautifulsoup4

安裝這個庫,並看一下簡單使用。

from bs4 import BeautifulSoup
soup = BeautifulSoup('example.html', 'html.parser') #加載我們的html文件
soup.find('div') # 找到 div 標籤


"""
<div class="main-page">
<ul class="menu-list">
<li>首頁</li>
<li>新聞</li>
<li>影視</li>
</ul>
</div>
"""

soup.find_all('li') # 找到所有 li 標籤

"""
[<li>首頁</li>, <li>新聞</li>, <li>影視</li>]
"""

>>>for i in li:
   print(i.text)    #獲取每個 li 標籤的內容

"""
首頁
新聞
影視
"""

詳細的操作可以去看一下文檔,文檔非常詳細,例子也很多,簡單明瞭。

糗百爬蟲代碼
我們先爬取純文本的內容 https://www.qiushibaike.com/text/ 爬取這個鏈接下的內容。我們把頁面結構截圖如下,我們要獲取的信息,我用紅色的進行了標註。
在這裏插入圖片描述

圖一:
找到<div class=”col1 old-style-col1”>,該div包括下一層的作者信息的div
在這裏插入圖片描述

圖二:

在這裏插入圖片描述

下面我們看一下代碼怎麼寫:

import requests
from bs4 import BeautifulSoup

"""
python3
bs4.__version__: '4.5.1'

"""
def download_page(url):
   headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:61.0) Gecko/20100101 Firefox/61.0"}
   r = requests.get(url, headers=headers)  # 增加headers, 模擬瀏覽器
   return r.text


def get_content(html, page):
   output = """第{}頁 作者:{} 性別:{} 年齡:{} 點贊:{} 評論:{}\n{}\n------------\n"""
   # 最終輸出格式
   soup = BeautifulSoup(html, 'html.parser')

   # con = soup.find('div', class_='col1 old-style-col1')  # 如圖一紅色方框

   con_list = soup.find_all('div', class_="article")  # 找到文章列表
   for i in con_list:
       # print(i)
       author = i.find('h2').string  # 獲取作者名字
       print(author)
       # exit(0)
       content = i.find('div', class_='content').find('span').get_text()  # 獲取內容
       stats = i.find('div', class_='stats')
       vote = stats.find('span', class_='stats-vote').find('i', class_='number').string
       comment = stats.find('span', class_='stats-comments').find('i', class_='number').string
       author_info = i.find('div', class_='articleGender')  # 獲取作者 年齡,性別
       if author_info is not None:  # 非匿名用戶
           class_list = author_info['class']
           if "womenIcon" in class_list:
               gender = '女'
           elif "manIcon" in class_list:
               gender = '男'
           else:
               gender = ''
           age = author_info.string   # 獲取年齡
       else:  # 匿名用戶
           gender = ''
           age = ''

       save_txt(output.format(page, author, gender, age, vote, comment, content))


def save_txt(*args):
   for i in args:
       with open('qiubai.txt', 'a', encoding='utf-8') as f:
           f.write(i)


def main():
   # 我們點擊下面鏈接,在頁面下方可以看到共有13頁,可以構造如下 url,
   # 當然我們最好是用 Beautiful Soup找到頁面底部有多少頁。
   for i in range(1, 14):
       url = 'https://qiushibaike.com/text/page/{}'.format(i)
       html = download_page(url)
       # print(html)
       # print(type(html))
       # exit(0)
       get_content(html, i)


if __name__ == '__main__':
   main()



運行代碼後,我們會得到 'qiubai.txt’文件,打開後如下所示

在這裏插入圖片描述

reference:
https://mp.weixin.qq.com/s/ApnEy6NWS2f-DqIIrhHzGw

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