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:
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“.
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)
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:
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:
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)
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:
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)
Post-Detailseite (T):
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) #实现自动翻页功能
Screenshot nach dem Entfernen:
Screenshot nach Implementierung des automatischen Seitenwechsels:
此时我们已经可以匹配了所有的帖子的 url 了。
点击每个帖子后面的按钮就可以查看帖子具体详情了。
代码:
@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, }
插入数据库的话,需要我们在之前定义一个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()
查看爬虫运行结果:
先debug下,再调成running。pyspider框架在windows下的bug
设置跑的速度,建议不要跑的太快,否则很容易被发现是爬虫的,人家就会把你的IP给封掉的
查看运行工作
查看爬取下来的内容
然后再本地数据库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, }
以上就是Python爬虫实战之爬取 V2EX 网站帖子的内容,更多相关内容请关注PHP中文网(www.php.cn)!