python3 爬蟲---爬取糗事百科

来源:http://www.cnblogs.com/haichong/archive/2017/12/23/8094531.html
-Advertisement-
Play Games

這次爬取的網站是糗事百科,網址是:http://www.qiushibaike.com/hot/page/1 分析網址,參數'page/'後面的數字'1'指的是頁數,第二頁就是'/page/2',以此類推。。。 一、分析網頁 網頁圖片 然後明確要爬取的元素:作者名、內容、好笑數、以及評論數量 每一個 ...


這次爬取的網站是糗事百科,網址是:http://www.qiushibaike.com/hot/page/1

分析網址,參數'page/'後面的數字'1'指的是頁數,第二頁就是'/page/2',以此類推。。。

 

一、分析網頁

網頁圖片

 

然後明確要爬取的元素:作者名、內容、好笑數、以及評論數量

 

每一個段子的信息存放在'div id="content-left"'下的div

爬取元素的所在位置

 

二、爬取部分

  工具  

    Python3

   requests

   xpath

 

  1、獲取每一個段子

1 # 返回頁面的div_list
2     def getHtmlDivList(self, pageIndex):
3         pageUrl = 'http://www.qiushibaike.com/hot/page/' + str(pageIndex)
4         html = requests.get(url=pageUrl, headers=self.headers).text
5         selector = etree.HTML(html)
6         divList = selector.xpath('//div[@id="content-left"]/div')
7         return divList

 

   

  每一個段子都在div中,這裡用xpath,篩選出來後返回的是一個列表,每一個div都在裡面

  

  2、獲取每一個段子中的元素

 1     def getHtmlItems(self, divList):
 2 
 3         items = []
 4 
 5         for div in divList:
 6             item = []
 7             # 發佈人
 8             name = div.xpath('.//h2/text()')[0].replace("\n", "")
 9             item.append(name)
10 
11             # 內容(閱讀全文)
12             contentForAll = div.xpath('.//div[@class="content"]/span[@class="contentForAll"]')
13             if contentForAll:
14                 contentForAllHref = div.xpath('.//a[@class="contentHerf"]/@href')[0]
15                 contentForAllHref = "https://www.qiushibaike.com" + contentForAllHref
16                 contentForAllHrefPage = requests.get(url=contentForAllHref).text
17                 selector2 = etree.HTML(contentForAllHrefPage)
18                 content = selector2.xpath('//div[@class="content"]/text()')
19                 content = "".join(content)
20                 content = content.replace("\n", "")
21             else:
22                 content = div.xpath('.//div[@class="content"]/span/text()')
23                 content = "".join(content)
24                 content = content.replace("\n", "")
25             item.append(content)
26 
27             # 點贊數
28             love = div.xpath('.//span[@class="stats-vote"]/i[@class="number"]/text()')
29             love = love[0]
30             item.append(love)
31 
32             # 評論人數
33             num = div.xpath('.//span[@class="stats-comments"]//i[@class="number"]/text()')
34             num = num[0]
35             item.append(num)
36 
37             items.append(item)
38 
39         return items

  這裡需要註意的是,xpath返回的是一個列表,篩選出來後需要用[0]獲取到字元串類型

  上面的代碼中,爬取的內容里,有的段子是這樣的,如下圖:     

  內容中會有標簽<br>,那麼用xpath爬取出來後,裡面的內容都會成一個列表(這裡的div就是列表),

  那div[0]就是"有一次回老家看姥姥,遇到舅媽說到表弟小時候的事~",所以需要將div轉換成字元串  

  其他的部分就xpath語法的使用

 

  3、保存進文本

 1 # 保存入文本
 2     def saveItem(self, items):
 3         f = open('F:\\Pythontest1\\qiushi.txt', "a", encoding='UTF-8')
 4 
 5         for item in items:
 6             name = item[0]
 7             content = item[1]
 8             love = item[2]
 9             num = item[3]
10 
11             # 寫入文本
12             f.write("發佈人:" + name + '\n')
13             f.write("內容:" + content + '\n')
14             f.write("點贊數:" + love + '\t')
15             f.write("評論人數:" + num)
16             f.write('\n\n')
17 
18         f.close()

  

  4、全部代碼 

  1 import os
  2 import re
  3 import requests
  4 from lxml import etree
  5 
  6 
  7 # 糗事百科爬蟲
  8 class QSBK:
  9     # 初始化方法,定義變數
 10     def __init__(self):
 11         self.pageIndex = 1
 12         self.headers = {
 13             "User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.86 Safari/537.36"
 14         }
 15         self.enable = False
 16 
 17     # 返回頁面的div_list
 18     def getHtmlDivList(self, pageIndex):
 19         pageUrl = 'http://www.qiushibaike.com/hot/page/' + str(pageIndex)
 20         html = requests.get(url=pageUrl, headers=self.headers).text
 21         selector = etree.HTML(html)
 22         divList = selector.xpath('//div[@id="content-left"]/div')
 23         return divList
 24 
 25     # 獲取文本中要截取的元素
 26     def getHtmlItems(self, divList):
 27 
 28         items = []
 29 
 30         for div in divList:
 31             item = []
 32             # 發佈人
 33             name = div.xpath('.//h2/text()')[0].replace("\n", "")
 34             item.append(name)
 35 
 36             # 內容(閱讀全文)
 37             contentForAll = div.xpath('.//div[@class="content"]/span[@class="contentForAll"]')
 38             if contentForAll:
 39                 contentForAllHref = div.xpath('.//a[@class="contentHerf"]/@href')[0]
 40                 contentForAllHref = "https://www.qiushibaike.com" + contentForAllHref
 41                 contentForAllHrefPage = requests.get(url=contentForAllHref).text
 42                 selector2 = etree.HTML(contentForAllHrefPage)
 43                 content = selector2.xpath('//div[@class="content"]/text()')
 44                 content = "".join(content)
 45                 content = content.replace("\n", "")
 46             else:
 47                 content = div.xpath('.//div[@class="content"]/span/text()')
 48                 content = "".join(content)
 49                 content = content.replace("\n", "")
 50             item.append(content)
 51 
 52             # 點贊數
 53             love = div.xpath('.//span[@class="stats-vote"]/i[@class="number"]/text()')
 54             love = love[0]
 55             item.append(love)
 56 
 57             # 評論人數
 58             num = div.xpath('.//span[@class="stats-comments"]//i[@class="number"]/text()')
 59             num = num[0]
 60             item.append(num)
 61 
 62             items.append(item)
 63         
 64         return items
 65 
 66     # 保存入文本
 67     def saveItem(self, items):
 68         f = open('F:\\Pythontest1\\qiushi.txt', "a", encoding='UTF-8')
 69 
 70         for item in items:
 71             name = item[0]
 72             content = item[1]
 73             love = item[2]
 74             num = item[3]
 75 
 76             # 寫入文本
 77             f.write("發佈人:" + name + '\n')
 78             f.write("內容:" + content + '\n')
 79             f.write("點贊數:" + love + '\t')
 80             f.write("評論人數:" + num)
 81             f.write('\n\n')
 82 
 83         f.close()
 84 
 85     # 判斷文本是否已創建,添加路徑
 86     def judgePath(self):
 87         if os.path.exists('F:\\Pythontest1') == False:
 88             os.mkdir('F:\\Pythontest1')
 89         if os.path.exists("F:\\Pythontest1\\qiushi.txt") == True:
 90             os.remove("F:\\Pythontest1\\qiushi.txt")
 91 
 92     def start(self):
 93         self.judgePath()
 94         print("正在讀取糗事百科,按回車繼續保存下一頁,Q退出")
 95         self.enable = True
 96         while self.enable:
 97             divList = self.getHtmlDivList(self.pageIndex)
 98             data = self.getHtmlItems(divList)
 99             self.saveItem(data)
100             print('已保存第%d頁的內容' % self.pageIndex)
101             pan = input('是否繼續保存:')
102             if pan != 'Q':
103                 self.pageIndex += 1
104                 self.enable = True
105             else:
106                 print('程式運行結束!!')
107                 self.enable = False
108 
109 
110 spider = QSBK()
111 spider.start()
View Code
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 本文的目的是把以前的ssm項目改造成基於springboot搭建的。 以前的ssm項目在SSM(SPRING,SPRINGMVC,MYBATIS)整合的MAVEN單工程(上) http://www.cnblogs.com/yuanjava/p/6748956.html 文章里 1.新增maven工程 ...
  • 2 兩個星號加字典名 ...
  • //遍歷輸出tuple元素的簡潔方式(C++11) //Win32Con17_VS2017_01.cpp #include #include using namespace std; template void myprint_impl(tuple tup) //泛化版本 { //cout (tup... ...
  • 引言 - 一時心起, libuv linux 搭建 有一天突然想起來想寫個動畫. 找了一下 ui 庫太大. 後面想起以前弄過的 libuv. 但發現 libuv 相關資料也很少. 所以就有了這些內容. libuv - https://github.com/libuv/libuv libuv 在 li ...
  • 這個工具類,用線程的方式實現文件的複製,效果勉強還算可以。功能不夠完善。 根據兩個路徑字元串(文件路徑或文件夾路徑),實現文件的複製,具體用的方法,註釋還算清楚。 不能在構造方法里拋出異常,好難受。 ...
  • 1# 判斷二元一次方程ax+by=c是否有整數解: c%gcd(a,b) == 0 2# ab的最小公倍數 = a*b/最大公約數 3# 最大公約數: 輾轉相除法 4# n進位的轉換用% / +迴圈/遞歸來解決. 5# a&1判斷一個數是奇數還是偶數 6# 高精度加法,乘法原理: 7# 整數a/b向 ...
  • UI界面展示: 3D模型界面: 灰度分佈界面: 下麵是源程式: 下一個任務:進行邊界檢測 思路: 文中圖片 鏈接:鏈接:https://pan.baidu.com/s/1hsImLla 密碼:m2ip ...
  • 最近在學django框架,準備用django寫一個博客園的系統,並且在寫的過程中也遇到一些問題,實踐出真知,對django開發web應用方面也有了進一步的瞭解。很多操作實現都是以我所認知的技術完成的,可能存在不合理的地方(畢竟實現的方法多種多樣),基本完成後會將源碼上傳到git,也歡迎各位大神指正。 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...