Heim  >  Artikel  >  Backend-Entwicklung  >  Scrapy implementiert den Sina Weibo-Crawler

Scrapy implementiert den Sina Weibo-Crawler

little bottle
little bottlenach vorne
2019-04-28 16:08:504611Durchsuche

In diesem Artikel geht es hauptsächlich um die Verwendung von Scrapy zur Implementierung des Sina Weibo-Crawlers. Weitere Informationen finden Sie hier Probieren Sie es doch selbst aus!

Aufgrund des Abschlusses des Projekts muss ich kürzlich eine Reihe von Daten sammeln. Nach dem Do-it-yourself-Prinzip haben wir die Weibo-Inhalte von fast hundert bekannten Prominenten im Alter von 14 bis 18 Jahren von Sina Weibo gesammelt. Schauen Sie sich an, was die Großen normalerweise auf Weibo posten ~
1. Erstens ist das Projekt in Scrapy geschrieben, was Zeit und Mühe spart. Wer es verwendet, wird es wissen.
Die gesammelte Website ist weibo.com, die Webseite von Weibo. Es ist etwas aufwändiger, aber der Inhalt ist im Vergleich zu mobilen Segmenten und WAP-Sites etwas umfassender.
2. Schauen wir uns vor dem Sammeln an, welche Hindernisse Weibo für uns eingerichtet hat.

  • Anmelden
  • Seiten-JS-Rendering

Da Weibo standardmäßig 302 verwendet, springt es für Benutzer, die sich nicht angemeldet haben, zur Anmeldeschnittstelle. Weibo wird Qian erfasst Ich muss Weibo denken lassen, dass diese Sammlung zu faul war. Sie haben sich direkt manuell angemeldet und das Cookie dann in Scrapy gespeichert. Bringen Sie das Cookie zum Zugriff mit, da das Sammlungsvolumen schätzungsweise nur 100.000 beträgt Artikel über. Hier muss ich diejenigen, die Scrapy noch nicht kennen, daran erinnern, dass die Cookies von Scrapy eine ähnliche Form haben wie JSON. Es ist nicht so, als würde man sie direkt in Anfragen einfügen und das Format konvertieren.
Scrapy implementiert den Sina Weibo-Crawler
Es ist wahrscheinlich so, also müssen Sie das Cookie nach dem Anmelden einfügen und mit dem Code konvertieren. Der Code lautet wie folgt:

class transCookie:
    def __init__(self, cookie):
        self.cookie = cookie

    def stringToDict(self):
        itemDict = {}
        items = self.cookie.split(';')
        for item in items:
            key = item.split('=')[0].replace(' ', '')
            value = item.split('=')[1]
            itemDict[key] = value
        return itemDict


if __name__ == "__main__":
    cookie = "你的cookie"
    trans = transCookie(cookie)
    print(trans.stringToDict())

Ich denke, ein Cookie ist fast Es werden genug drei Cookies gespeichert. Die einfache Möglichkeit, mehrere Cookies zu speichern, besteht darin, mehrere Cookies direkt in einem Array abzulegen und bei jeder Anfrage zufällig eines auszuwählen Wenn eine Menge Daten gesammelt und dann abgehoben werden, ist es notwendig, einen Kontopool in großem Umfang zu unterhalten. Bringen Sie ua und Kekse mit, wenn Sie eine Anfrage stellen. Wie folgt:
Scrapy implementiert den Sina Weibo-Crawler
Weibo unterscheidet jeden Benutzer anhand von OID. Nehmen wir als Beispiel Daniel Wus Weibo. Klicken Sie mit der rechten Maustaste auf die Homepage, um die Webseitenquelle anzuzeigen Code. Wir können sehen:
Scrapy implementiert den Sina Weibo-Crawler
Das OID hier ist die eindeutige Kennung jedes Benutzers. Die entsprechende Homepage-Adresse des Benutzers lautet https://weibo.com + oid. Mit der Adresse können wir sie direkt in die Weibo-Schnittstelle eingeben und die URL-Adresse zusammensetzen, zum Beispiel:
https://. weibo .com/wuyanzu?is_all=1&stat_date=201712#feedtop
Dies ist Wu Yanzus Weibo im Dezember 2017. Wir können leicht herausfinden, dass wir durch einfaches Ändern der Nummer nach stat_date die entsprechende Weibo-Adresse erhalten. Für einige Benutzer mit einer großen Menge an Weibo kann das erneute Laden von JS dazu führen, dass unser cooler männlicher Gott, Herr Wu Yanzu, definitiv nicht so viel posten wird. Zum Beispiel:

Scrapy implementiert den Sina Weibo-Crawler, Sie können sehen, dass das verbleibende Weibo den Benutzern durch asynchrones Laden von js präsentiert werden muss. Öffnen Sie den Browser-Entwicklermodus,

Scrapy implementiert den Sina Weibo-Crawler
Scrapy implementiert den Sina Weibo-Crawler

Wenn wir die mit js geladenen Seiten zweimal vergleichen, können wir leicht feststellen, dass der Unterschied zwischen Request_URL nur in der Seitenleiste und _rnd besteht Parameter, der erste stellt die Anzahl der Seiten dar und der zweite ist die Verschlüsselung der Zeit (es spielt keine Rolle, ob Sie ihn nicht zum Testen verwenden), sodass wir nur die Anzahl der Seiten erstellen müssen. Einige Weibo-Beiträge mit großem Umfang müssen möglicherweise noch umgedreht werden. Der Grund ist derselbe.

class SpiderItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    nickname = scrapy.Field()
    follow = scrapy.Field()
    fan = scrapy.Field()
    weibo_count = scrapy.Field()
    authentication = scrapy.Field()
    address = scrapy.Field()
    graduated = scrapy.Field()
    date = scrapy.Field()
    content = scrapy.Field()
    oid = scrapy.Field()

设置需要爬取的字段nickname昵称,follow关注,fan粉丝,weibo_count微博数量,authentication认证信息,address地址,graduated毕业院校,有些微博不显示的默认设置为空,以及oid和博文内容及发布时间。
这里说一下内容的解析,还是吴彦祖微博,如果我们还是像之前一样直接用scrapy的解析规则去用xpath或者css选择器解析会发现明明结构找的正确却匹配不出数据,这就是微博坑的地方,点开源代码。我们发现:
Scrapy implementiert den Sina Weibo-Crawler
微博的主题内容全是用script包裹起来的!!!这个问题当初也是困扰了博主很久,反复换着法子用css和xpath解析始终不出数据。
解决办法:正则匹配(无奈但有效)
至此,就可以愉快的进行采集了,附上运行截图:
Scrapy implementiert den Sina Weibo-Crawler
输入导入mongodb:
Scrapy implementiert den Sina Weibo-Crawler

相关教程:Python视频教程

Das obige ist der detaillierte Inhalt vonScrapy implementiert den Sina Weibo-Crawler. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:csdn.net. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen