Heim  >  Artikel  >  Backend-Entwicklung  >  [Python] Webcrawler (8): Quellcode und Analyse des Webcrawlers (v0.3) von Encyclopedia of Embarrassments (vereinfachtes Update)

[Python] Webcrawler (8): Quellcode und Analyse des Webcrawlers (v0.3) von Encyclopedia of Embarrassments (vereinfachtes Update)

黄舟
黄舟Original
2017-01-21 14:31:051480Durchsuche

Fragen und Antworten:

1. Warum wird angezeigt, dass die Enzyklopädie der peinlichen Dinge für einen bestimmten Zeitraum nicht verfügbar ist?

Antwort: Vor einiger Zeit hat die Encyclopedia of Embarrassments einen Header-Test hinzugefügt, der das Crawlen unmöglich machte. Es ist notwendig, den Header im Code zu simulieren. Jetzt wurde der Code geändert und kann normal verwendet werden.


2. Warum müssen Sie einen separaten Thread erstellen?

A: Der grundlegende Prozess ist wie folgt: Der Crawler startet einen neuen Thread im Hintergrund und crawlt zwei Seiten der Encyclopedia of Embarrassing Things. Wenn weniger als zwei Seiten übrig sind, crawlt er eine weitere Seite. Wenn der Benutzer die Eingabetaste drückt, erhält er nur die neuesten Inhalte aus dem Inventar, anstatt online zu gehen, sodass das Surfen reibungsloser verläuft. Sie können den Ladevorgang auch im Hauptthread platzieren, dies führt jedoch zu langen Wartezeiten während des Crawling-Vorgangs.

Projektinhalt:

Ein in Python geschriebener Webcrawler für Encyclopedia of Embarrassing Things.

Verwendung:

Erstellen Sie eine neue Bug.py-Datei, kopieren Sie den Code hinein und doppelklicken Sie, um ihn auszuführen.

Programmfunktionen:

Durchsuchen Sie die Encyclopedia of Embarrassing Things in der Eingabeaufforderung.

Erklärung des Prinzips:

Durchsuchen Sie zunächst die Homepage von Embarrassing Encyclopedia: http://www.qiushibaike.com/hot/page/1

Okay. Es ist ersichtlich, dass die Nummer nach Seite/ im Link die entsprechende Seitennummer ist, um sich auf zukünftiges Schreiben vorzubereiten.

Klicken Sie dann mit der rechten Maustaste, um den Quellcode der Seite anzuzeigen:

[Python] Webcrawler (8): Quellcode und Analyse des Webcrawlers (v0.3) von Encyclopedia of Embarrassments (vereinfachtes Update)

Beobachtung ergab, dass jeder Absatz mit einem div markiert ist, wobei „class“ Inhalt und sein muss title ist die Veröffentlichungszeit, wir müssen nur reguläre Ausdrücke verwenden, um sie zu „abziehen“.

Nachdem Sie das Prinzip verstanden haben, ist der Rest der Inhalt regulärer Ausdrücke. Sie können sich auf diesen Blog-Beitrag beziehen:

http://blog.csdn.net/wxg694175346/article/details/. 8929576


Betriebseffekt:

[Python] Webcrawler (8): Quellcode und Analyse des Webcrawlers (v0.3) von Encyclopedia of Embarrassments (vereinfachtes Update)

# -*- coding: utf-8 -*-    
     
import urllib2    
import urllib    
import re    
import thread    
import time    
  
    
#----------- 加载处理糗事百科 -----------    
class Spider_Model:    
        
    def __init__(self):    
        self.page = 1    
        self.pages = []    
        self.enable = False    
    
    # 将所有的段子都扣出来,添加到列表中并且返回列表    
    def GetPage(self,page):    
        myUrl = "http://m.qiushibaike.com/hot/page/" + page    
        user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'   
        headers = { 'User-Agent' : user_agent }   
        req = urllib2.Request(myUrl, headers = headers)   
        myResponse = urllib2.urlopen(req)  
        myPage = myResponse.read()    
        #encode的作用是将unicode编码转换成其他编码的字符串    
        #decode的作用是将其他编码的字符串转换成unicode编码    
        unicodePage = myPage.decode("utf-8")    
    
        # 找出所有class="content"的div标记    
        #re.S是任意匹配模式,也就是.可以匹配换行符    
        myItems = re.findall(&#39;<div.*?class="content".*?title="(.*?)">(.*?)</div>&#39;,unicodePage,re.S)    
        items = []    
        for item in myItems:    
            # item 中第一个是div的标题,也就是时间    
            # item 中第二个是div的内容,也就是内容    
            items.append([item[0].replace("\n",""),item[1].replace("\n","")])    
        return items    
    
    # 用于加载新的段子    
    def LoadPage(self):    
        # 如果用户未输入quit则一直运行    
        while self.enable:    
            # 如果pages数组中的内容小于2个    
            if len(self.pages) < 2:    
                try:    
                    # 获取新的页面中的段子们    
                    myPage = self.GetPage(str(self.page))    
                    self.page += 1    
                    self.pages.append(myPage)    
                except:    
                    print &#39;无法链接糗事百科!&#39;    
            else:    
                time.sleep(1)    
            
    def ShowPage(self,nowPage,page):    
        for items in nowPage:    
            print u&#39;第%d页&#39; % page , items[0]  , items[1]    
            myInput = raw_input()    
            if myInput == "quit":    
                self.enable = False    
                break    
            
    def Start(self):    
        self.enable = True    
        page = self.page    
    
        print u&#39;正在加载中请稍候......&#39;    
            
        # 新建一个线程在后台加载段子并存储    
        thread.start_new_thread(self.LoadPage,())    
            
        #----------- 加载处理糗事百科 -----------    
        while self.enable:    
            # 如果self的page数组中存有元素    
            if self.pages:    
                nowPage = self.pages[0]    
                del self.pages[0]    
                self.ShowPage(nowPage,page)    
                page += 1    
    
    
#----------- 程序的入口处 -----------    
print u"""  
---------------------------------------  
   程序:糗百爬虫  
   版本:0.3  
   作者:why  
   日期:2014-06-03  
   语言:Python 2.7  
   操作:输入quit退出阅读糗事百科  
   功能:按下回车依次浏览今日的糗百热点  
---------------------------------------  
"""  
    
    
print u&#39;请按下回车浏览今日的糗百内容:&#39;    
raw_input(&#39; &#39;)    
myModel = Spider_Model()    
myModel.Start()

Das Obige ist der [Python]-Webcrawler (8 ) : Inhalt des Webcrawlers (v0.3) Quellcode und Analyse (vereinfachtes Update) der Encyclopedia of Embarrassing Things. Weitere verwandte Inhalte finden Sie auf der chinesischen PHP-Website (www.php.cn)!


Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn