ホームページ  >  記事  >  バックエンド開発  >  Scrapy が新浪微博クローラーを実装

Scrapy が新浪微博クローラーを実装

little bottle
little bottle転載
2019-04-28 16:08:504612ブラウズ

この記事では主に、scrapy を使用して Sina Weibo クローラーを実装する方法について説明します。これには一定の参考価値があります。興味のある友人は詳細を確認して、次のことを確認できます。まあ、自分で試してみてください!

最近、プロジェクトの完了に伴い、大量のデータを収集する必要があります。私たちは、DIY の原則に基づいて、14 年から 18 年までの 100 人近くの著名人の Weibo コンテンツを新浪 Weibo から収集しました。偉い人たちが普段 Weibo に投稿している内容を見てみましょう ~
1. まず第一に、プロジェクトは Scrapy で書かれているため、時間と労力が節約されます。
収集された Web サイトは、Weibo の Web ページである weibo.com です。少し面倒ではありますが、コンテンツはモバイルセグメントやwapサイトと比較してわずかに包括的です。
2. 収集する前に、まず Weibo が私たちにどのような障害を設けているかを見てみましょう。

  • ログイン
  • ページ js レンダリング

Weibo のデフォルトは 302 なので、ログインしていないユーザーのログイン インターフェイスにジャンプするため、Weibo が収集されますQian は Weibo にこの収集が怠惰すぎると思わせたに違いありません。彼らは直接手動でログインし、Cookie を Scrapy に保存しました。要求するときは、Cookie を訪問してください。収集量はそれほど多くないため、収集量はわずかであると推定されますアイテム数約 100,000ここで、scrapy を初めて使用する人に注意していただきたいのは、scrapy の Cookie は json に似た形式であり、リクエストに直接貼り付けて使用するのとは異なり、形式を変換する必要があります。
Scrapy が新浪微博クローラーを実装
おそらくこんな感じなので、ログイン後にクッキーを貼り付けてコードで変換する必要があります コードは以下の通りです:

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())

クッキーはほぼ1つだと思います十分です。3 つの Cookie が保存されています。複数の Cookie を保存する簡単な方法は、複数の Cookie を配列に直接配置し、リクエストが行われるたびにランダム関数を使用してランダムに 1 つを選択することです。もちろん、これは状況に限った話です。データのバッチが収集されてから取り出される場合、アカウントプールを大規模に維持する必要があります。リクエストの際はuaとクッキーをご持参ください。次のように:
Scrapy が新浪微博クローラーを実装
Weibo は各ユーザーを oid で区別します。Daniel Wu の Weibo を例に挙げます。Weibo 検索インターフェイスで Daniel Wu を検索し、ホームページを右クリックしてソース コードを表示します。
Scrapy が新浪微博クローラーを実装
ここでの oid は各ユーザーの一意の識別子です。対応するユーザーのホームページ アドレスは https://weibo.com oid です。
アドレスを使用すると、Weibo インターフェイスに直接入力してアドレスを収集し、URL アドレスを結合できます (例:
https://weibo)。 .com/wuyanzu?is_all=1&stat_date=201712#feedtop
これは、2017 年 12 月の Wu Yanzu の Weibo です。対応する Weibo アドレスを取得するには、stat_date の後の数字を変更するだけでよいことを見つけるのは難しくありません。大量の Weibo を持っているユーザーの中には、毎月の Weibo にも js の読み込みが必要になる場合があります。もちろん、私たちのクールな男性神である Wu Yanzu 氏は、間違いなくそれほど多くの投稿をすることはありません。比較する別の Weibo を見つけてみましょう。大規模なセルフメディアの場合例:
Scrapy が新浪微博クローラーを実装
、残りの Weibo は、js 非同期読み込みを通じてユーザーに表示する必要があることがわかります。ブラウザの開発者モードを開きます。
Scrapy が新浪微博クローラーを実装
Scrapy が新浪微博クローラーを実装

#js で読み込まれたページを 2 回比較すると、Request_URL の違いは pagebar と _rnd のみであることが簡単にわかります。パラメータの最初のパラメータはページ数を表し、2 番目のパラメータは時間の暗号化 (テストに使用しない場合は問題ありません) であるため、ページ数を構築するだけで済みます。膨大な量の Weibo 投稿の一部は依然としてひっくり返す必要がある場合があり、同じ原則が当てはまります。

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 が新浪微博クローラーを実装
微博的主题内容全是用script包裹起来的!!!这个问题当初也是困扰了博主很久,反复换着法子用css和xpath解析始终不出数据。
解决办法:正则匹配(无奈但有效)
至此,就可以愉快的进行采集了,附上运行截图:
Scrapy が新浪微博クローラーを実装
输入导入mongodb:
Scrapy が新浪微博クローラーを実装

相关教程:Python视频教程

以上がScrapy が新浪微博クローラーを実装の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はcsdn.netで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。