python3製作捧腹網段子頁爬蟲

高洛峰
發布: 2017-02-14 13:37:00
原創
1759 人瀏覽過

網上的Python教程大都是2.X版本的,python2.X和python3.X相比較改動比較大,好多庫的用法不太一樣,我安裝的是python3.X,我們來看看詳細的例子

0x01

春節閒著沒事(是有多閒),就寫了個簡單的程序,來爬點笑話看,順帶記錄下寫程序的過程。第一次接觸爬蟲是看了這麼一個帖子,一個逗逼,爬取煎蛋網上妹子的照片,簡直不要太方便。於是乎自己照貓畫虎,抓了點圖。

科技啟迪未來,身為一個程式設計師,怎麼能幹這種事呢,還是爬點笑話比較有益於身心健康。

python3製作捧腹網段子頁爬蟲

0x02

在我們擼起袖子開始搞之前,先來普及點理論知識。

簡單地說,我們要把網頁上特定位置的內容,扒拉下來,具體怎麼扒拉,我們得先分析這個網頁,看那塊內容是我們需要的。例如,這次爬取的是捧腹網上的笑話,打開 捧腹網段子頁我們可以看到一大堆笑話,我們的目的就是獲取這些內容。看完回來冷靜一下,你這樣一直笑,我們沒辦法寫程式。在 chrome 中,我們開啟 檢視元素 然後一級一級的展開 HTML 標籤,或點選那個小滑鼠,定位我們所需的元素。

python3製作捧腹網段子頁爬蟲

最後可以發現

中的內容就是我們所需要的笑話,在看第二條笑話,也是這樣。於是乎,我們就可以把這個網頁中所有的

找到,然後把裡邊的內容提取出來,就完成了。

0x03

好了,現在我們知道我們的目的了,就可以擼起袖子開始乾了。這裡我用的 python3,關於 python2 和 python3 的選用,大家可以自行決定,功能都可以實現,只是有些許不同。但還是建議用 python3。
我們要扒拉下我們需要的內容,首先我們得把這個網頁扒拉下來,怎麼扒拉呢,這裡我們要用到一個庫,叫 urllib,我們用這個庫提供的方法,來獲取整個網頁。
首先,我們導入urllib


複製碼 程式碼如下:

 import urllib.request as request

如下:


def getHTML(url):

return request.urlopen(url).read()

人生苦短,我用python,一行程式碼,下載網頁,你說,還有什麼理由不用python。 下載完網頁後,我們就得解析這個網頁了來取得我們所需要的元素。為了解析元素,我們需要使用另一個工具,稱為 Beautiful Soup,使用它,可以快速解析 HTML 和 XML並取得我們所需的元素。



複製程式碼

程式碼如下:


soup = BeautifulSoup(getHTML("http://www.pengfu.com/xiaohua_1.html"))

用Beautifulful當你執行程式碼的時候,會出現這麼一個警告,提示要指定一個解析器,不然,可能會在其他平台或系統上報錯。

複製程式碼

程式碼如下:


/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/was 4/181 Userpy. explicitly specified, so I'm using the best available HTML parser for this system ("lxml"). This usually isn't a problem, but if you run this code on another system, or in aifferent virtual environment, mvironment, mifferent v. a different parser and behave differently.

The code that caused this warning is on line 64 of the file joke.py. To get rid of this warning, change code that looks like this:hourk up to this:

 BeautifulSoup([your markup], "lxml")

  markup_type=markup_type))

解析器的種類和不同解析器之間的區別官方文檔有詳細說明,還是詳細的說明,目前還是詳細說明用lxml 解析比較可靠。

修改後

複製程式碼

程式碼如下:


soup = BeautifulSoup(getHTML("http://www.pengfu.com/xiaohua_1.html", 'lgxml'))

這樣,就沒有上述警告了。


複製程式碼 程式碼如下:

p_array = soup.find_all('p', {'class':"content-img clearfix pt10 relative"}) content-img clearfix pt10 relative 的p 標籤接著遍歷這個陣列


複製程式碼

程式碼如下:for x in p_array: content = x.string

for x in p_array: content = x.string 內容的內容。至此,我們已經達到了我們的目的,爬到了我們的笑話。

但當以同樣的方式去爬取糗百的時候,會報這樣一個錯誤


複製代碼 代碼如下:

raise RemoteDisconnected("Roteem 代碼如下:

raise RemoteDisconnected("Roteem 代碼如下:


raise RemoteDisconnected("Roteem 代碼如下:

raise RemoteDisconnected("Roteem 代碼如下:

raise RemoteDisconnected("Roteem. Remote end closed connection without response

說遠端無響應,關閉了鏈接,看了下網絡也沒有問題,這是什麼情況導致的呢? 。 /3.5 而在chrome 中存取UA 是User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36,那會不會是因為6,那會不會是因為伺服器根據UA 來判斷拒絕了python 爬蟲。 -Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36'}quest  .urlopen(req).read()

這樣就把python 偽裝成chrome 去獲取糗百的網頁,可以順利的得到數據。

至此,利用python 爬取糗百和捧腹網的笑話已經結束,我們只需要分析對應的網頁,找到我們感興趣的元素,利用python 強大的功能,就可以達到我們的目的,不管是XXOO 的圖,還是內涵段子,都可以一鍵搞定,不說了,我去找點妹子圖看看。

# -*- coding: utf-8 -*-
import sys
import urllib.request as request
from bs4 import BeautifulSoup

def getHTML(url):
  headers = {'User-Agent': 'User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36'}
  req = request.Request(url, headers=headers)
  return request.urlopen(req).read()

def get_pengfu_results(url):
  soup = BeautifulSoup(getHTML(url), 'lxml')
  return soup.find_all('p', {'class':"content-img clearfix pt10 relative"})

def get_pengfu_joke():
  for x in range(1, 2):
    url = 'http://www.pengfu.com/xiaohua_%d.html' % x
    for x in get_pengfu_results(url):
      content = x.string
      try:
        string = content.lstrip()
        print(string + '\n\n')
      except:
        continue
  return

def get_qiubai_results(url):
  soup = BeautifulSoup(getHTML(url), 'lxml')
  contents = soup.find_all('p', {'class':'content'})
  restlus = []
  for x in contents:
    str = x.find(&#39;span&#39;).getText(&#39;\n&#39;,&#39;<br/>&#39;)
    restlus.append(str)
  return restlus

def get_qiubai_joke():
  for x in range(1, 2):
    url = &#39;http://www.qiushibaike.com/8hr/page/%d/?s=4952526&#39; % x
    for x in get_qiubai_results(url):
      print(x + &#39;\n\n&#39;)
  return

if __name__ == &#39;__main__&#39;:
  get_pengfu_joke()
  get_qiubai_joke()
登入後複製

更多python3製作捧腹網段子頁爬蟲、相關文章請關注PHP中文網!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!