最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python制作小說(shuō)爬蟲實(shí)錄

 更新時(shí)間:2017年08月14日 08:51:47   作者:果子圓圓  
本文給大家介紹的是作者所寫的第一個(gè)爬蟲程序的全過(guò)程,從構(gòu)思到思路到程序的編寫,非常的細(xì)致,有需要的小伙伴可以參考下

紀(jì)念我的第一個(gè)爬蟲程序,一共寫了三個(gè)白天,其中有兩個(gè)上午沒(méi)有看,中途遇到了各種奇怪的問(wèn)題,伴隨著他們的解決,對(duì)于一些基本的操作也弄清楚了。果然,對(duì)于這些東西的最號(hào)的學(xué)習(xí)方式,就是在使用中學(xué)習(xí),通過(guò)解決問(wèn)題的方式來(lái)搞定這些知識(shí)。按需索取,才能更有針對(duì)性。

大體記錄下整個(gè)過(guò)程。

--------------------------------------------------------------------------------

準(zhǔn)備構(gòu)思

出于對(duì)于python的熱愛,想要嘗試一些練手的項(xiàng)目,但是不論是看書,還是直接嘗試別人的項(xiàng)目,到最后都會(huì)淪為不停地復(fù)制粘貼...最實(shí)際的就是自己來(lái)上手親自寫代碼。思路都是一樣的,但是具體的實(shí)現(xiàn)還得靠自己。

以前的復(fù)制粘貼給我的幫助也就是告訴了我大致的流程。

確定目標(biāo)網(wǎng)址

目標(biāo)網(wǎng)址是關(guān)鍵。我夢(mèng)想中的爬蟲是那種偏向于更智能的,直接給他一個(gè)想要獲取的關(guān)鍵詞,一步步的流程直接自己完成,可以自己給定范圍,也可以直接爬取整個(gè)互聯(lián)網(wǎng)或者更實(shí)際的就是整個(gè)百度上的內(nèi)容,但是,目前就我而言,見到的爬蟲,都是給定目標(biāo)網(wǎng)址,通過(guò)目標(biāo)頁(yè)面上的內(nèi)容進(jìn)一步執(zhí)行規(guī)定的操作,所以現(xiàn)在來(lái)看,我們?cè)趯懪老x之前,需要確定一個(gè)基準(zhǔn)頁(yè)面,這個(gè)是需要我們事先制定的。在考慮我們需要程序完成怎樣的功能,獲取頁(yè)面文本還是相關(guān)鏈接內(nèi)容還是其他的目的。

我這個(gè)程序想要獲取的是《劍來(lái)》小說(shuō),把各個(gè)章節(jié)的內(nèi)容爬去下載存儲(chǔ)到文件里。

編程只是實(shí)現(xiàn)目的的工具。

所以重點(diǎn)是分析我們的需求。

獲取小說(shuō)目錄頁(yè)面是基本。這里有各個(gè)章節(jié)的鏈接,標(biāo)題等等內(nèi)容。這是我們需要的。

有了各個(gè)章節(jié)的鏈接,就需要進(jìn)入其中獲得各個(gè)章節(jié)的內(nèi)容。

所以,我們需要獲得頁(yè)面內(nèi)容,需要從中獲得目標(biāo)內(nèi)容。

所以使用 urllib.request,re 庫(kù)。

前者用來(lái)獲得網(wǎng)頁(yè)內(nèi)容,后者獲得目標(biāo)信息。

headers

直接使用urllib.request的urlopen(),read()方法是會(huì)報(bào)以下錯(cuò)誤:

raise HTTPError(req.get_full_url(), code, msg, hdrs, fp)
HTTPError: HTTP Error 403: Forbidden

出現(xiàn)urllib2.HTTPError: HTTP Error 403: Forbidden錯(cuò)誤是由于網(wǎng)站禁止爬蟲,可以在請(qǐng)求加上頭信息,偽裝成瀏覽器。

headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.3; Win64; x64; rv:55.0) Gecko/20100101 Firefox/55.0'}
request = url_req.Request(url, headers=headers)
response = url_req.urlopen(request, data=None, timeout=3)
html = response.read().decode('GBK')

注意:這里存在兩個(gè)容易出問(wèn)題的地方。
•編碼:編碼問(wèn)題是使用爬蟲中有時(shí)候會(huì)很頭痛的問(wèn)題,由于網(wǎng)頁(yè)源代碼編碼格式不明確,所以這里嘗試了許久。

使用chardet庫(kù)的detect()方法可以檢測(cè)字節(jié)字符串的編碼。所以直接檢測(cè)這里的html(先不要解碼)。輸出的是GB2312,但是在后面頁(yè)面的爬取中,會(huì)出現(xiàn)提示有的字符的編碼異常,所以這里采取了比其范圍更廣的中文字符集GBK,解決了這個(gè)問(wèn)題。
•設(shè)置超時(shí)范圍:由于頻繁的獲取網(wǎng)頁(yè)內(nèi)容,目標(biāo)網(wǎng)站有時(shí)候會(huì)出現(xiàn)沒(méi)有響應(yīng)的問(wèn)題。

(這個(gè)問(wèn)題可以見我在CSDN上的提問(wèn):關(guān)于python爬蟲程序中途停止的問(wèn)題)

于是我采取了捕獲 urlopen()的socket.timeout異常,并在出現(xiàn)異常的時(shí)候再循環(huán)訪問(wèn),直到獲得目標(biāo)頁(yè)面。

獲得目標(biāo)內(nèi)容

這里使用的是正則表達(dá)式。re模塊。這里的使用并不復(fù)雜。

首先需要一個(gè)模式字符串。以re.I指定忽略大小寫,編譯后的對(duì)象擁有本身匹配的方法,這里使用的是findall(),返回一個(gè)所有結(jié)果組成的列表。可以及時(shí)返回輸出其內(nèi)容,進(jìn)而選擇合適的部分進(jìn)行處理。

python 正則表達(dá)式

通過(guò)查看相關(guān)的符號(hào),這里使用(.+?)來(lái)實(shí)現(xiàn)匹配非貪婪模式(盡量少的)下任意無(wú)限字符,對(duì)之使用(),進(jìn)而匹配括號(hào)內(nèi)的模式。

文件寫入

使用with open() as file:,進(jìn)而可以處理文件。并且可以自動(dòng)執(zhí)行打開和關(guān)閉文件,更為便捷安全。
with open(findall_title[0] + '.txt', 'w+', encoding='utf-8') as open_file:

•這里也要注意編碼的問(wèn)題,指定utf-8。會(huì)避免一些問(wèn)題。
•這里使用w+模式,追加寫文件。

完整代碼

# -*- coding: utf-8 -*-
"""
Created on Fri Aug 11 16:31:42 2017
@author: lart
"""

import urllib.request as url_req
import re, socket, time


def r_o_html(url):
  print('r_o_html begin')

  headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.3; Win64; x64; rv:55.0) Gecko/20100101 Firefox/55.0'}

  request = url_req.Request(url, headers=headers)

  NET_STATUS = False
  while not NET_STATUS:
    try:
      response = url_req.urlopen(request, data=None, timeout=3)
      html = response.read().decode('GBK')
      print('NET_STATUS is good')
      print('r_o_html end')
      return html
    except socket.timeout:
      print('NET_STATUS is not good')
      NET_STATUS = False

def re_findall(re_string, operation, html):

  print('re_findall begin')
  pattern = re.compile(re_string, re.I)

  if operation == 'findall':
    result = pattern.findall(html)
  else:
    print('this operation is invalid')
    exit(-1)

  print('re_findall end')
  return result


if __name__ == '__main__':
  url_base = 'http://www.7kankan.la/book/1/'

  html = r_o_html(url_base)

  findall_title = re_findall(r'<title>(.+?)</title>', 'findall', html)

  findall_chapter = re_findall(r'<dd class="col-md-3"><a href=[\',"](.+?)[\',"] title=[\',"](.+?)[\',"]>', 'findall', html)

  with open(findall_title[0] + '.txt', 'w+', encoding='utf-8') as open_file:
    print('article文件打開', findall_chapter)
    for i in range(len(findall_chapter)):
      print('第' + str(i) + '章')

      open_file.write('\n\n\t' + findall_chapter[i][1] + '\n --------------------------------------------------------------------- \n')

      url_chapter = url_base + findall_chapter[i][0]

      html_chapter = r_o_html(url_chapter)

      findall_article = re_findall(r'&nbsp;&nbsp;&nbsp;&nbsp;(.+?)<br />', 'findall', html_chapter)

      findall_article_next = findall_chapter[i][0].replace('.html', '_2.html')

      url_nextchapter = url_base + findall_article_next

      html_nextchapter = r_o_html(url_nextchapter)

      if html_nextchapter:
        findall_article.extend(re_findall(r'&nbsp;&nbsp;&nbsp;&nbsp;(.+?)<br />', 'findall', html_nextchapter))

        for text in findall_article:
          open_file.write(text + '\n')

      time.sleep(1)

  print('文件寫入完畢')

相關(guān)文章

  • Linux下通過(guò)python訪問(wèn)MySQL、Oracle、SQL Server數(shù)據(jù)庫(kù)的方法

    Linux下通過(guò)python訪問(wèn)MySQL、Oracle、SQL Server數(shù)據(jù)庫(kù)的方法

    這篇文章主要介紹了Linux下通過(guò)python訪問(wèn)MySQL、Oracle、SQL Server數(shù)據(jù)庫(kù)的方法,需要的朋友可以參考下
    2016-04-04
  • 如何利用pandas將Excel轉(zhuǎn)為html格式

    如何利用pandas將Excel轉(zhuǎn)為html格式

    工作中經(jīng)常會(huì)遇到Excel轉(zhuǎn)為html格式這種需求,下面這篇文章主要給大家介紹了關(guān)于如何利用pandas將Excel轉(zhuǎn)為html格式的相關(guān)資料,主要利用的是pd.to_html,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2021-08-08
  • 如何將bag文件批量轉(zhuǎn)成mp4

    如何將bag文件批量轉(zhuǎn)成mp4

    這篇文章主要介紹了將bag文件批量轉(zhuǎn)成mp4,這篇博客涉及的腳本用來(lái)將bag文件批量轉(zhuǎn)化為mp4文件,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-10-10
  • Python中方法的缺省參數(shù)問(wèn)題解讀

    Python中方法的缺省參數(shù)問(wèn)題解讀

    這篇文章主要介紹了Python中方法的缺省參數(shù)問(wèn)題解讀,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • Python中特殊函數(shù)集錦

    Python中特殊函數(shù)集錦

    這篇文章主要介紹了Python中特殊函數(shù),主要介紹一下四個(gè)函數(shù):1 過(guò)濾函數(shù)filter 2 映射和歸并函數(shù)map/reduce 3 裝飾器@ 4 匿名函數(shù)lamda,需要的朋友可以參考下
    2015-07-07
  • Appium+python自動(dòng)化之連接模擬器并啟動(dòng)淘寶APP(超詳解)

    Appium+python自動(dòng)化之連接模擬器并啟動(dòng)淘寶APP(超詳解)

    這篇文章主要介紹了Appium+python自動(dòng)化之 連接模擬器并啟動(dòng)淘寶APP(超詳解)本文以淘寶app為例,通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2019-06-06
  • Python帶你從淺入深探究Tuple(基礎(chǔ)篇)

    Python帶你從淺入深探究Tuple(基礎(chǔ)篇)

    大家都知道Python中的元組容器序列(tuple)與列表容器序列(list)有很多相同之處,他們雖然都可以存儲(chǔ)任意類型的數(shù)據(jù),但是一個(gè)元組定義好之后就不能夠再進(jìn)行修改,對(duì)Python Tuple相關(guān)知識(shí)感興趣的朋友一起看看吧
    2021-05-05
  • python快速排序的實(shí)現(xiàn)及運(yùn)行時(shí)間比較

    python快速排序的實(shí)現(xiàn)及運(yùn)行時(shí)間比較

    這篇文章主要介紹了python快速排序的實(shí)現(xiàn)及運(yùn)行時(shí)間比較,本文通過(guò)兩種方法給大家介紹,大家可以根據(jù)自己需要選擇適合自己的方法,對(duì)python實(shí)現(xiàn)快速排序相關(guān)知識(shí)感興趣的朋友一起看看吧
    2019-11-11
  • python小程序基于Jupyter實(shí)現(xiàn)天氣查詢的方法

    python小程序基于Jupyter實(shí)現(xiàn)天氣查詢的方法

    這篇文章主要介紹了python小程序基于Jupyter實(shí)現(xiàn)天氣查詢的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-03-03
  • python中的閉包和裝飾器的使用示例

    python中的閉包和裝飾器的使用示例

    閉包就是能夠讀取其他函數(shù)內(nèi)部變量的函數(shù),例如在javascript中,只有函數(shù)內(nèi)部的子函數(shù)才能讀取局部變量,所以閉包可以理解成“定義在一個(gè)函數(shù)內(nèi)部的函數(shù),這篇文章主要介紹了python中的閉包和裝飾器的使用,需要的朋友可以參考下
    2022-11-11

最新評(píng)論

唐河县| 遂川县| 通道| 盖州市| 永登县| 德安县| 宣威市| 巴彦淖尔市| 华安县| 宜都市| 高邑县| 定襄县| 常熟市| 屏南县| 鹤壁市| 吉木萨尔县| 西林县| 肇庆市| 江川县| 万盛区| 景洪市| 昭通市| 治县。| 鄱阳县| 海伦市| 邢台县| 玛多县| 彭州市| 济阳县| 呼伦贝尔市| 运城市| 千阳县| 得荣县| 漳平市| 中西区| 隆子县| 巫溪县| 太康县| 凌海市| 曲靖市| 灯塔市|