1. 程式人生 > >python爬蟲從0到1遇到問題及解決方向

python爬蟲從0到1遇到問題及解決方向

一.環境介紹

1.由於使用慣了Eclipse,我直接在裡面裝了個pydev,當初裝的時候遇到些版本相容問題,請大家裝的時候一定要根據自己python版本來裝,我的是python2.7.X,注意線上安裝有個小坑,如下圖:


這是自動遮蔽舊版本,如果不注意會裝錯至最新,除了以上裝法,還有就是自己下載,解壓到Eclipse安裝

檔案的plugins檔案下。

二.python擴充套件工具包的使用和爬蟲整體思路


1.網頁下載器

可以用py自帶的urllib2,直接import使用即可,本文使用擴充套件的respects來充當下載器(因為功能比較強大,還有其他一些功能,如post),下載方式比較簡單,可以用pip命令(本人的不知道怎麼用不了,出現奇怪異常)不過可能會撞牆,推薦http://www.lfd.uci.edu/~gohlke/pythonlibs/找到相應的包,把字尾改為ZIP解壓到py的Lib中即可。

2.網頁解析器

主要用2種,都是擴充套件的(py不自帶),beautifulsoup4和xpath,個人感覺後一種好用一點,後面會具體介紹。

3.URL管理器

這個是自己用2個Set實現的,一個存放即將使用的URL,一個存放使用過的URL(不然可能在一個網頁迴圈爬取)。

三.實戰爬取起點高質量小說

1.爬取前的準備

由於我爬取的是起點的玄幻小說為主,所以我的起始URL為:

http://book.qidian.com/info/1004608738

然後觀察每個小說的URL 發現都是http://book.qidian.com/info/數字   格式,所以在每個頁面URL可以正則匹配,看是否符合格式。

2.核心程式碼,主模組


 while self.urls.has_new_url():
            try:
                #從URL管理器取出URL
                new_url = self.urls.get_new_url()
                #輸出當前爬取進度
                print 'craw %d : %s ;success :%d '%(sumcount,new_url,count)
                #網頁下載器獲取HTML頁面
                html_cont = self.downloader.download(new_url)
                #網頁解析器獲取資料和URL
                new_urls,new_data = self.parser.parse(new_url,html_cont.text,word_click_back[0])
                #將URL新增進URL管理器
                self.urls.add_new_urls(new_urls)
                #將資料存放在output中
                if new_data is not None:
                   count = self.outputer.collect_data(new_data,count,basescore,basewordcount,basewordclick)
                
                if count > sum:
                    break
                sumcount+=1
                
            except:
                print 'craw failed' 

3.網頁解析器模組

(1)2種解析器

①beautifulsoup4可以把HTML檔案解析成DOM樹,可以像訪問樹一樣,通過find方法一層層訪問,如

title_node = soup.find('div',class_="book-info").find("h1").find("em")...

②Xpath定位神器,可以直接定位所需資訊,結合chrome瀏覽器的copy Xpath簡直不要太簡單,下面寫Xpath用法

如下圖,匹配一個分數:

(2).檢查


(3).找到所需標籤,右鍵複製xpath,得到一串匹配字串


(4).得到字串(//*[@id="score1"]),寫程式碼

html_cont = requests.get(page_url,timeout=0.5)
selector = etree.HTML(html_cont.text)
word_count = selector.xpath('//*[@id="score1"]/text()')
res_data['word_count']=word_count[0]

(5).貼出解析器核心方法程式碼(前面使用bs4,後面使用Xpath)

def _get_new_data(self, page_url, soup,word_click_back):
        res_data = {}
        score = 0
        res_data['url'] = page_url
        #<dd class="lemmaWgt-lemmaTitle-title"> 小說名
        title_node = soup.find('div',class_="book-info").find("h1").find("em")
        res_data['title'] = title_node.get_text()
        #小說簡介
        summary_node = soup.find('p',class_="intro")
        res_data['summary'] = summary_node.get_text()
        #獲取getURL,獲取預載入資料
        score_url=self._get_score_url(page_url)
        res_data['score']=0
        
        if score_url is not None:
                    score_cont = requests.get(score_url,timeout=0.5)
                    try:
                       score=re.search('rate":(.*?),', score_cont.text, re.S).group(1)
                    except:
                        score=0   
        
        #以下使用Xpath
        res_data['score']=score
        #獲取字數資訊
        html_cont = requests.get(page_url,timeout=0.5)
        selector = etree.HTML(html_cont.text)
        word_count = selector.xpath('/html/body/div[2]/div[6]/div[1]/div[2]/p[3]/em[1]/text()')
        res_data['word_count']=word_count[0]
        #獲取"萬總點選",將值賦給res_data['word_click_num']
        word_click_back1= selector.xpath('/html/body/div[2]/div[6]/div[1]/div[2]/p[3]/cite[2]/text()')
        word_click_num1= selector.xpath('/html/body/div[2]/div[6]/div[1]/div[2]/p[3]/em[2]/text()')
        if word_click_back1[0]==word_click_back:
            res_data['word_click_num']=word_click_num1[0]
        else:
            res_data['word_click_num']=None    
            
         #獲取小說類別
        book_category = selector.xpath('/html/body/div[2]/div[6]/div[1]/div[2]/p[1]/a[1]/text()')
        res_data['book_category']=book_category[0]
       
        return res_data

4.成果展示,爬取10個符合條件的小說,條件可以自己設定,主要從字數,點選,評分來判定,

這裡設定字數10W以上,分數9以上,總點選50W以上


控制檯可以看到,這裡爬取了超過238個頁面才找到10本符合條件的小說

繼續看成果


5.遇到的問題

(1)python中爬取的資料返回值型別是_ElementStringResult,和int String難匹配,只能強制轉換

如:float() str()

(2)非同步載入和簡單反爬蟲

有些網頁是ajax非同步載入,你要post一些資料之後,他才能返回你想要的一些資料,具體可以通過chrome的

Network來檢視提交了什麼資料


然後構造一個字典,通過requests.post提交上去,就可以得到想要的返回資源。

同理有些反爬蟲要提交HTTP報頭也是如此

(3)預載入

這個問題從一開始就存在,困擾了我好幾天,爬蟲也被迫中斷,主要的表現是

爬取分數score 瀏覽器可以返回正常資料,但是我爬取到的資料一直是0!?

之後我在問題(2)中得到啟發,發現它每次重新整理都會發出一個根據uuid發出的

GET請求,然後資料才從那個response返回


http://book.qidian.com/ajax/comment/index?_csrfToken=hRMAi3nDUU6l7ZJo3hOcTeqXlFOcgJI8ZzGepfcq&bookId=1004608738&pageSize=15

然後response裡面包含我想要的分數資料,如下:


之後我就每個URL都構造一個這樣的請求來獲取分數資料,如下

 url="http://book.qidian.com/ajax/comment/index?_csrfToken=hRMAi3nDUU6l7ZJo3hOcTeqXlFOcgJI8ZzGepfcq&bookId="
            id=re.search('info/(\d+)', page_url, re.S).group(1)
            url=url+id

好,問題解決

四.爬蟲進階展望

(1)速度,這次爬取10本小說,總共爬取238+頁面,耗時2分鐘,實在難以想象爬取大量頁面的耗時,

可以用多執行緒Pool加以改進,雖然python的多執行緒不是真正的多執行緒,但是也會大大提高速度。

(2)反爬蟲

主要是代理,IP什麼的,不過我想一般的網站也不會考慮這麼多吧,程式設計師本身夠辛苦了,再考慮這些,真是累死猿了,想想自己也朝著這方面走。。。。

(3)賬號密碼提交,驗證碼

這個是以後主要方向,驗證碼最好爬取出來人工處理

本人小菜,歡迎指正交流,賬號名即qq,有錯別字下次再改,先將就著看

github原始碼:

https://github.com/bo07997/algorithm-

相關推薦

python爬蟲0到1遇到問題解決方向

一.環境介紹 1.由於使用慣了Eclipse,我直接在裡面裝了個pydev,當初裝的時候遇到些版本相容問題,請大家裝的時候一定要根據自己python版本來裝,我的是python2.7.X,注意線上安裝有個小坑,如下圖: 這是自動遮蔽舊版本,如果不注意會裝錯至最新,除了以上

Python爬蟲入門到精通(3): BeautifulSoup用法總結多執行緒爬蟲爬取糗事百科

本文是Python爬蟲從入門到精通系列的第3篇。我們將總結BeautifulSoup這個解析庫以及常用的find和select方法。我們還會利用requests庫和BeauitfulSoup來爬取糗事百科上的段子, 並對比下單執行緒爬蟲和多執行緒爬蟲的爬取效率。 什麼是

python爬蟲入門到放棄(五)之 正則的基本使用

語言 代碼例子 name 添加 iter ima 制表符 imp things 什麽是正則表達式 正則表達式是對字符串操作的一種邏輯公式,就是 事先定義好的一些特定字符、及這些特定字符的組合,組成一個“規則字符”,這個“規則字符” 來表達對字符的一種過濾邏輯。 正則並不是

python爬蟲入門到放棄(六)之 BeautifulSoup庫的使用

src 表達 支持 正則表達 必須 這樣的 com 子節點 prettify 上一篇文章的正則,其實對很多人來說用起來是不方便的,加上需要記很多規則,所以用起來不是特別熟練,而這節我們提到的beautifulsoup就是一個非常強大的工具,爬蟲利器。 beautifulS

python爬蟲入門到放棄(八)之 Selenium庫的使用

自動 .com 程序 png 都是 例子 等待 點擊 哪些 一、什麽是Selenium selenium 是一套完整的web應用程序測試系統,包含了測試的錄制(selenium IDE),編寫及運行(Selenium Remote Control)和測試的並行處理(Sele

Python爬蟲入門到放棄(十一)之 Scrapy框架整體的一個了解

object 定義 roc encoding eth obi pipe pos 等等 這裏是通過爬取伯樂在線的全部文章為例子,讓自己先對scrapy進行一個整理的理解 該例子中的詳細代碼會放到我的github地址:https://github.com/pythonsite/

Python爬蟲入門到放棄(十三)之 Scrapy框架的命令行詳解

directory xpath idf 成了 spider i386 名稱 4.2 不同的 這篇文章主要是對的scrapy命令行使用的一個介紹 創建爬蟲項目 scrapy startproject 項目名例子如下: localhost:spider zhaofan$ sc

Python爬蟲入門到放棄(十八)之 Scrapy爬取所有知乎用戶信息(上)

user 說過 -c convert 方式 bsp 配置文件 https 爬蟲 爬取的思路 首先我們應該找到一個賬號,這個賬號被關註的人和關註的人都相對比較多的,就是下圖中金字塔頂端的人,然後通過爬取這個賬號的信息後,再爬取他關註的人和被關註的人的賬號信息,然後爬取被關註人

使用python中出現的錯誤解決辦法

python【問題1】在編譯安裝完Python後,不能正常使用yum,使用yum出現以下錯誤[[email protected]/* */ bin]# yum File "/usr/bin/yum", line 30 except KeyboardInterrupt, e:

Python 爬蟲常見的坑和解決方法

gpo 爬蟲 nic 詳細 true wow user html encoding 1.請求時出現HTTP Error 403: Forbidden headers = {‘User-Agent‘:‘Mozilla/5.0 (Windows NT 6.1; WOW64;

mac 安裝 python mysqlclient 遇到的問題解決方法

direct local ges all info output posix con get 在 mac 上安裝 mysqlclient 遇到了一些問題,查找資料很多人都遇到了同樣的問題。通過資料和試驗,成功了。這裏記錄一下,希望幫到遇到同樣問題的人。 本人使用python

Python爬蟲入門到放棄 之 Scrapy框架中Download Middleware用法

sta 頻繁 space raw 處理 們的 img ear 法則 這篇文章中寫了常用的下載中間件的用法和例子。Downloader Middleware處理的過程主要在調度器發送requests請求的時候以及網頁將response結果返回給spiders的時候,所以從

Python爬蟲入門到成妖之3-----Scrapy框架的命令行詳解

參數 成了 openssl 入門 文件中 crawler 1.0 使用 lob 創建爬蟲項目 scrapy startproject 項目名 例子如下: E:\crawler>scrapy startproject test1 New Scrapy pro

Python爬蟲入門到成妖之7-----Scrapy框架中Download Middleware用法

例子 start col res urn 鉤子 exception 安裝 打印 這篇文章中寫了常用的下載中間件的用法和例子。Downloader Middleware處理的過程主要在調度器發送 requests請求的時候以及網頁將 response結果返回給 spiders

scrapy框架爬蟲爬取糗事百科 之 Python爬蟲入門到放棄第不知道多少天(1)

Scrapy框架安裝及使用 1. windows 10 下安裝 Scrapy 框架:   前提:安裝了python-pip    1. windows下按住win+R 輸入cmd   2. 在cmd 下 輸入       pip install scrapy       pip inst

Python爬蟲--http詳解chrome響應URL過程

什麼是http和https協議: 1.HTTP協議:全稱是HyperText Transfer Protocol,中文意思是超文字傳輸協議,是一種釋出和接收HTML頁面的方法。伺服器埠號是80埠。 2.HTTPS協議:是HTTP協議的加密版本,在HTTP下加入了SSL層。

Python爬蟲入門到進階(1)之Python概述

支持 color python運行 nbsp python自動化 人工智 應用領域 翻譯 接下來 1.計算機語言概述 (1).語言:交流的工具,溝通的媒介 (2).計算機語言:人跟計算機交流的工具 (3).Python是計算機語言的一種 2.Python編程語言   代碼:

Python環境搭建遇到問題解決方案記錄

pip版本問題 環境使用Ubuntu16.04 , 安裝pip3 $sudo apt-get install python3-pip   預設安裝pip8.1.1,更新後是18.1 $pip3 install --upgrade pip   需要修改

python安裝PIL失敗原因解決方案

在windows下的虛擬環境安裝PIL: pip install PIL 出現報錯資訊: 原因: 經過查詢資料發現,python2可以使用pip install PIL安裝PIL第三方包。而我是使用的是python3,現在python3已經用Pillow代替PIL。

Python爬蟲入門到進階(2)之爬蟲簡介

法律 進階 爬蟲 哪裏 back 目標 ack 數據分析 取數 1.爬蟲入門:使用代碼模擬真實用戶發送網絡請求批量獲取數據1).爬蟲價值: 1.買賣數據(高端領域特別貴) 2.數據分析(出分析報告) 3.流量 4.阿裏指數,百度指數2).合法性:灰色