Heim > Backend-Entwicklung > Python-Tutorial > Der Python-Crawler übt das Crawlen von V2EX-Websitebeiträgen

Der Python-Crawler übt das Crawlen von V2EX-Websitebeiträgen

高洛峰
Freigeben: 2016-11-07 16:43:35
Original
1943 Leute haben es durchsucht

Hintergrund:

PySpider: Ein leistungsstarkes Webcrawler-System, geschrieben von einem Chinesen mit einer leistungsstarken WebUI. Es ist in der Python-Sprache geschrieben, verfügt über eine verteilte Architektur, unterstützt mehrere Datenbank-Backends und die leistungsstarke WebUI unterstützt Skripteditor, Aufgabenmonitor, Projektmanager und Ergebnisanzeige. Online-Beispiel: http://demo.pyspider.org/

Offizielle Dokumentation: http://docs.pyspider.org/en/l...

Github: https:// github.com/binux/pysp...

Github-Adresse des Crawler-Codes dieses Artikels: https://github.com/zhisheng17...

Weitere spannende Artikel finden Sie hier Auf dem öffentlichen WeChat-Konto: Ape-Blog, lesen Sie es und folgen Sie ihm gerne.

Nachdem wir so viel gesagt haben, schauen wir uns den Haupttext an!

Voraussetzung:

Sie haben Pyspider und MySQL-Python bereits installiert (Daten speichern)

Wenn Sie es noch nicht installiert haben, lesen Sie bitte meinen vorherigen Artikel, um Umwege zu vermeiden.

Einige Fallstricke, auf die ich beim Erlernen des Pyspider-Frameworks gestoßen bin

HTTP 599: SSL-Zertifikatproblem: Fehler beim Abrufen des lokalen Ausstellerzertifikats nicht möglich

Einige Fehler, auf die ich gestoßen bin:

Der Python-Crawler übt das Crawlen von V2EX-Websitebeiträgen

Das Ziel dieses Crawlers besteht zunächst darin, mithilfe des Pyspider-Frameworks die Fragen und Inhalte in den Beiträgen der V2EX-Website zu crawlen und die gecrawlten Daten dann lokal zu speichern.

Um die meisten Beiträge in V2EX anzuzeigen, ist keine Anmeldung erforderlich. Natürlich ist für einige Beiträge eine Anmeldung erforderlich, bevor Sie sie anzeigen können. (Da ich beim Crawlen ständig Fehler gefunden habe und nach Überprüfung der spezifischen Gründe herausgefunden habe, dass Sie sich anmelden müssen, um diese Beiträge anzuzeigen.) Daher halte ich es nicht für notwendig, Cookies zu verwenden. Natürlich, wenn Sie Sie müssen sich anmelden, es ist sehr einfach. Die lokale Methode besteht darin, das Cookie nach der Anmeldung hinzuzufügen.

Wir haben https://www.v2ex.com/ gescannt und festgestellt, dass es keine Liste gibt, die alle Beiträge enthalten kann. Wir können uns nur für die nächstbeste Sache entscheiden und alle Tag-Listen unter der Kategorie durchsuchen . Seite zum Durchlaufen aller Beiträge: https://www.v2ex.com/?tab=tech und dann https://www.v2ex.com/go/progr... Schließlich lautet die detaillierte Adresse jedes Beitrags (für Beispiel): https://www.v2ex.com/t/314683...

Erstellen Sie ein Projekt

Klicken Sie in der unteren rechten Ecke des Pyspider-Dashboards auf die Schaltfläche „Erstellen“.

Der Python-Crawler übt das Crawlen von V2EX-Websitebeiträgen

Ersetzen Sie die URL von self.crawl in der Funktion on_start:

@every(minutes=24 * 60) 
    def on_start(self): 
        self.crawl('https://www.v2ex.com/', callback=self.index_page, validate_cert=False)
Nach dem Login kopieren

self.crawl weist Pyspider an, die angegebene Seite zu crawlen und dann zu verwenden die Callback-Funktion zum Parsen der Ergebnisse.

@every)-Modifikator, der angibt, dass on_start einmal am Tag ausgeführt wird, damit die neuesten Beiträge erfasst werden können.

validate_cert=False muss so lauten, andernfalls wird HTTP 599: SSL-Zertifikatproblem: Fehler beim Abrufen des lokalen Ausstellerzertifikats gemeldet.

Homepage:

Klicken Sie auf das Grün Zum Ausführen ausführen. Über dem Folgenden wird eine rote 1 angezeigt. Wechseln Sie zum folgenden Bereich und klicken Sie auf die grüne Wiedergabeschaltfläche:

Der Python-Crawler übt das Crawlen von V2EX-Websitebeiträgen

Der Python-Crawler übt das Crawlen von V2EX-Websitebeiträgen

Zweites Bild Dieses Problem erschien im Screenshot am Anfang. Die Lösung finden Sie im zuvor geschriebenen Artikel. Später tritt das Problem nicht mehr auf.

Tab-Listenseite:

Der Python-Crawler übt das Crawlen von V2EX-Websitebeiträgen

Auf der Tab-Listenseite müssen wir die URLs aller Themenlistenseiten extrahieren. Möglicherweise haben Sie festgestellt, dass der Beispielhandler einen sehr großen URL-

-Code extrahiert hat:

@config(age=10 * 24 * 60 * 60) 
    def index_page(self, response): 
        for each in response.doc('a[href^="https://www.v2ex.com/?tab="]').items(): 
            self.crawl(each.attr.href, callback=self.tab_page, validate_cert=False)
Nach dem Login kopieren

Da die Beitragslistenseite und die Registerkartenlistenseite unterschiedlich lang sind, werden sie hier erstellt . Ein Rückruf ist self.tab_page

@config(age=10 24 60 * 60). Dies bedeutet, dass wir davon ausgehen, dass die Seite innerhalb von 10 Tagen gültig ist und die

nicht aktualisiert und gecrawlt wird Gehen Sie erneut zur Listenseite:

Der Python-Crawler übt das Crawlen von V2EX-Websitebeiträgen

Code:

@config(age=10 * 24 * 60 * 60) 
 
def tab_page(self, response): 
 
for each in response.doc('a[href^="https://www.v2ex.com/go/"]').items(): 
 
self.crawl(each.attr.href, callback=self.board_page, validate_cert=False)
Nach dem Login kopieren

Post-Detailseite (T):

Der Python-Crawler übt das Crawlen von V2EX-Websitebeiträgen

Sie können sehen, dass die Ergebnisse einige Antwortelemente enthalten. Wir benötigen diese nicht und können sie entfernen.

Gleichzeitig müssen wir ihn auch die Funktion zum automatischen Umblättern erkennen lassen.

Code:

@config(age=10 * 24 * 60 * 60) 
    def board_page(self, response): 
        for each in response.doc('a[href^="https://www.v2ex.com/t/"]').items(): 
            url = each.attr.href 
            if url.find('#reply')>0: 
                url = url[0:url.find('#')] 
            self.crawl(url, callback=self.detail_page, validate_cert=False) 
        for each in response.doc('a.page_normal').items(): 
            self.crawl(each.attr.href, callback=self.board_page, validate_cert=False) 
            #实现自动翻页功能
Nach dem Login kopieren

Screenshot nach dem Entfernen:

Der Python-Crawler übt das Crawlen von V2EX-Websitebeiträgen

Screenshot nach Implementierung des automatischen Seitenwechsels:

Der Python-Crawler übt das Crawlen von V2EX-Websitebeiträgen

此时我们已经可以匹配了所有的帖子的 url 了。

点击每个帖子后面的按钮就可以查看帖子具体详情了。

Der Python-Crawler übt das Crawlen von V2EX-Websitebeiträgen

代码:

@config(priority=2) 
    def detail_page(self, response): 
        title = response.doc('h1').text() 
        content = response.doc('p.topic_content').html().replace('"', '\\"') 
        self.add_question(title, content)  #插入数据库 
        return { 
            "url": response.url, 
            "title": title, 
            "content": content, 
        }
Nach dem Login kopieren

插入数据库的话,需要我们在之前定义一个add_question函数。

#连接数据库 
def __init__(self): 
        self.db = MySQLdb.connect('localhost', 'root', 'root', 'wenda', charset='utf8') 
 
    def add_question(self, title, content): 
        try: 
            cursor = self.db.cursor() 
           sql = 'insert into question(title, content, user_id, created_date, comment_count)
            values ("%s","%s",%d, %s, 0)' % 
            (title, content, random.randint(1, 10) , 'now()');   
            #插入数据库的SQL语句 
            print sql 
            
            cursor.execute(sql) 
            print cursor.lastrowid 
            self.db.commit() 
        except Exception, e: 
            print e 
            self.db.rollback()
Nach dem Login kopieren

查看爬虫运行结果:

Der Python-Crawler übt das Crawlen von V2EX-Websitebeiträgen

先debug下,再调成running。pyspider框架在windows下的bug

设置跑的速度,建议不要跑的太快,否则很容易被发现是爬虫的,人家就会把你的IP给封掉的

查看运行工作

查看爬取下来的内容

Der Python-Crawler übt das Crawlen von V2EX-Websitebeiträgen

Der Python-Crawler übt das Crawlen von V2EX-WebsitebeiträgenDer Python-Crawler übt das Crawlen von V2EX-Websitebeiträgen

然后再本地数据库GUI软件上查询下就可以看到数据已经保存到本地了。

自己需要用的话就可以导入出来了。

在开头我就告诉大家爬虫的代码了,如果详细的看看那个project,你就会找到我上传的爬取数据了。(仅供学习使用,切勿商用!)

当然你还会看到其他的爬虫代码的了,如果你觉得不错可以给个 Star,或者你也感兴趣的话,你可以fork我的项目,和我一起学习,这个项目长期更新下去。

最后:

代码:

# created by 10412 
# !/usr/bin/env python 
# -*- encoding: utf-8 -*- 
# Created on 2016-10-20 20:43:00 
# Project: V2EX 
 
from pyspider.libs.base_handler import * 
 
import re 
import random 
import MySQLdb 
 
class Handler(BaseHandler): 
    crawl_config = { 
    } 
 
    def __init__(self): 
        self.db = MySQLdb.connect('localhost', 'root', 'root', 'wenda', charset='utf8') 
 
    def add_question(self, title, content): 
        try: 
            cursor = self.db.cursor() 
          sql = 'insert into question(title, content, user_id, created_date, comment_count) 
         values ("%s","%s",%d, %s, 0)' % (title, content, random.randint(1, 10) , 'now()'); 
            print sql 
            cursor.execute(sql) 
            print cursor.lastrowid 
            self.db.commit() 
        except Exception, e: 
            print e 
            self.db.rollback() 
 
 
    @every(minutes=24 * 60) 
    def on_start(self): 
        self.crawl('https://www.v2ex.com/', callback=self.index_page, validate_cert=False) 
 
    @config(age=10 * 24 * 60 * 60) 
    def index_page(self, response): 
        for each in response.doc('a[href^="https://www.v2ex.com/?tab="]').items(): 
            self.crawl(each.attr.href, callback=self.tab_page, validate_cert=False) 
 
 
    @config(age=10 * 24 * 60 * 60) 
    def tab_page(self, response): 
        for each in response.doc('a[href^="https://www.v2ex.com/go/"]').items(): 
            self.crawl(each.attr.href, callback=self.board_page, validate_cert=False) 
 
 
    @config(age=10 * 24 * 60 * 60) 
    def board_page(self, response): 
        for each in response.doc('a[href^="https://www.v2ex.com/t/"]').items(): 
            url = each.attr.href 
            if url.find('#reply')>0: 
                url = url[0:url.find('#')] 
            self.crawl(url, callback=self.detail_page, validate_cert=False) 
        for each in response.doc('a.page_normal').items(): 
            self.crawl(each.attr.href, callback=self.board_page, validate_cert=False) 
 
 
    @config(priority=2) 
    def detail_page(self, response): 
        title = response.doc('h1').text() 
        content = response.doc('p.topic_content').html().replace('"', '\\"') 
        self.add_question(title, content)  #插入数据库 
        return { 
            "url": response.url, 
            "title": title, 
            "content": content, 
        }
Nach dem Login kopieren

以上就是Python爬虫实战之爬取 V2EX 网站帖子的内容,更多相关内容请关注PHP中文网(m.sbmmt.com)!


Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage