python—多協程爬取糗事百科熱圖

来源:https://www.cnblogs.com/summer1019/archive/2019/02/18/10398688.html
-Advertisement-
Play Games

今天在使用正則表達式時未能解決實際問題,於是使用bs4庫完成匹配,通過反覆測試,最終解決了實際的問題,加深了對bs4.BeautifulSoup模塊的理解。 爬取流程 前奏: 分析糗事百科熱圖板塊的網址,因為要進行翻頁爬取內容,所以分析不同頁碼的網址信息是必要的 具體步驟: 1,獲取網頁內容(url ...


今天在使用正則表達式時未能解決實際問題,於是使用bs4庫完成匹配,通過反覆測試,最終解決了實際的問題,加深了對bs4.BeautifulSoup模塊的理解。

爬取流程

前奏:

分析糗事百科熱圖板塊的網址,因為要進行翻頁爬取內容,所以分析不同頁碼的網址信息是必要的

具體步驟:

1,獲取網頁內容(urllib.request)# 糗事百科有發爬蟲技術,所以要添加headers,偽裝程瀏覽器

2,解析網頁內容,獲取圖片鏈接(from bs4 import BeautifulSoup)

3,通過圖片鏈接下載圖片(urllib.request),並存儲到本地

備註:

具體的爬取說明在代碼都有詳細的解釋

  1 import urllib.request
  2 import requests
  3 from bs4 import BeautifulSoup
  4 # import re
  5 import gevent
  6 from gevent import monkey
  7 import bs4
  8 
  9 monkey.patch_all()
 10 
 11 
 12 def get_html_text(url, raw_html_text, depth):
 13 
 14     # 爬取網頁數據
 15 
 16     # 糗事百科有反爬蟲機制,需要設置請求頭偽裝成瀏覽器
 17     hd = ('User-Agent','Mozilla/5.0(Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Ch    rome/49.0.2623.22 Safari/537.36 SE 2.X MetaSr 1.0')
 18 
 19     # 創建opener對象
 20     opener = urllib.request.build_opener()
 21     opener.addheaders = [hd]
 22 
 23     # 將opener對象設置為全局
 24     urllib.request.install_opener(opener)
 25 
 26     # 翻頁爬取html_text
 27     for i in range(depth):
 28         # 根據對網址的分析,構造符合翻頁時的網址
 29         url_real = url + str(i+1)
 30         try:
 31             html_data = urllib.request.urlopen(url_real).read().decode('utf-8', 'ignore')
 32             raw_html_text.append(html_data)
 33             # 測試代碼
 34             # print(len(html_data))
 35         except Exception as result:
 36             print('錯誤類型:', result)
 37     
 38     print('提取網頁信息完成...')
 39     return raw_html_text
 40     # 測試代碼         
 41     # print(len(raw_html_text))
 42 
 43 
 44 def parser_html_text(raw_html_text, done_img):
 45 
 46     # 對爬取的網頁數據進行遍歷
 47 
 48     for html_text in raw_html_text:
 49         # 使用BeautifulSoup對網頁進行解析
 50         soup = BeautifulSoup(html_text, 'html.parser')
 51         # 使用soup.find_all('div','thumb') 查找出每個網頁中所有標簽是div,屬性值是thumb的標簽
 52         # 通過對網頁源代碼的分析,圖片信息都存儲在該標簽下的孫子標簽img中的屬性src中
 53         # 遍歷每個div標簽
 54         for tag in soup.find_all('div', 'thumb'):
 55             # 判斷 tag 是否是bs4.element.Tag屬性,因為在標簽div下,並不是全部是標簽
 56             if isinstance(tag, bs4.element.Tag):
 57                 # 遍歷每個div標簽下的所有孫子標簽
 58                 for img in tag.descendants:
 59                     # 判斷標簽的名字是不是‘img’,如果是,取出標簽中屬性src的屬性值。
 60                     if img.name == 'img':
 61                         link = img.get('src')
 62                         done_img.append(link)
 63     #測試代碼
 64     #print(done_img)
 65     print('網頁解析完成...')
 66     return done_img
 67 
 68 def save_crawler_data(done_img):
 69     # 將目標文本存儲到本地‘./’表示當前目錄
 70     path = './img/'
 71     # enumerate(list) 返回索引及索引對應的列表內的元素
 72     for i,j in enumerate(done_img):
 73         # 分析爬取的鏈接,前面缺少‘https:’,使用字元串拼接
 74         j ='https:' + j
 75         # 通過urllib.request.urlopen()下載圖片
 76         try:
 77             img_data = urllib.request.urlopen(j).read()
 78             path_real = path + str(i+1)
 79             with open(path_real, 'wb') as f:
 80                 f.write(img_data)
 81         except:
 82             continue
 83     print('圖片存儲完成')
 84 
 85 
 86 def main():
 87     url = 'https://www.qiushibaike.com/imgrank/page/'
 88     depth = 20
 89     raw_html_text = list()
 90     done_img = list()
 91     Raw_html_text = get_html_text(url, raw_html_text, depth)
 92     Done_img = parser_html_text(Raw_html_text, done_img)
 93     gevent.joinall([
 94         gevent.spawn(get_html_text,url,raw_html_text,depth),
 95         gevent.spawn(parser_html_text,Raw_html_text,done_img),
 96         gevent.spawn(save_crawler_data,Done_img)
 97         ])
 98 
 99     save_crawler_data(done_img)
100 
101 
102 if __name__ == '__main__':
103     main()

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 圖層包含的要素可以是矢量形式的也可以是柵格形式的。 這裡介紹其中一種:添加TileLayer.(載入Image類型的圖層) 引用:"esri/layers/TileLayer" 舉例:1.獲取圖層信息 var houseLayer = new TileLayer({ url:"https://til ...
  • 之前發現在模板的樣式表裡寫樣式不起作用,然後想起vue里有個/deep/,angular會不會也有一個,果然,發現了一個::ng-deep可以在模板的樣式表裡覆蓋ng-zorro的樣式。記錄一下(●'◡'●) ...
  • LieBrother公眾號原文 : "行為型模式:中介者模式" 十一大行為型模式之二:中介者模式。 簡介 姓名 :中介者模式 英文名 :Mediator Pattern 價值觀 :讓你體驗中介是無所不能的存在 個人介紹 : Define an object that encapsulates how ...
  • 1、a[i]++:表示對當前數組元素值自增,此時可以把a[i]簡單看做一個變數x,操作後,x的值加1; 結果: 2、a[i++]:表示指向下一個數組元素值; 結果: 註意:此處有i++和++i的陷阱,實際應用的時候註意。 ...
  • 接上篇python 閉包&裝飾器(一) 一、功能函數加參數:實現一個可以接收任意數據的加法器 源代碼如下: def show_time(f): def inner(*x, **y): # 形參 start = time.time() f(*x, **y) # 相當於add() end = time.... ...
  • 虛擬機創建項目 pycharm創建項目 開啟項目 一、虛擬機創建項目 1. 創建虛擬環境 workon 查看虛擬環境 mkvirtualenv -p /usr/bin/python3.5 envname 創建虛擬環境 workon envname 進入虛擬環境 deactivate 退出虛擬環境 r ...
  • 給定一個整數數組和一個目標值,找出數組中和為目標值的兩個數。你可以假設每個輸入只對應一種答案,且同樣的元素不能被重覆利用。 示例: 給定 nums = [2, 7, 11, 15], target = 9 因為 nums[0] + nums[1] = 2 + 7 = 9 所以返回 [0, 1] 代碼 ...
  • 文件切分演算法 文件切分演算法主要用於確定InputSplit的個數以及每個InputSplit對應的數據段。 FileInputFormat以文件為單位切分成InputSplit。對於每個文件,由以下三個屬性值確定其對應的InputSplit的個數。 goalSize:根據用戶期望的InputSpli ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...