首頁  >  文章  >  後端開發  >  scrapy實現新浪微博爬蟲

scrapy實現新浪微博爬蟲

little bottle
little bottle轉載
2019-04-28 16:08:504601瀏覽

這篇文章主要講述了用scrapy實現新浪微博爬蟲,具有一定的參考價值,有興趣的朋友可以了解一下,看完不妨自己試試看!

最近因為做畢設的原因,需要採集一批資料。本著自己動手的原則,從新浪微博上採集到近百位大家耳熟能詳的明星14-18年的微博內容。看看大佬們平常都在微博上都有哪些動態吧~
1.首先項目採用scrapy編寫,省時省力誰用誰知道。
採集的網站為weibo.com,是微博的網頁端。稍微麻煩了一點,但相對於移動段和wap網站來說內容稍微更全一點。
2.採集之前我們先來看下微博都給我們設置了哪些障礙。

  • 登入
  • 頁面js渲染

由於微博對於沒登入的使用者預設都是302跳到登入介面,所以擷取微博錢必須得讓微博認為,本次採集偷了個懶,直接是先手動登入然後保存cookie到scrapy上,請求的時候帶上cookie去訪問,因為採集量並不是很大,估計也就10w條左右。這裡需要對剛入scrapy的小夥伴需要提醒一下,scrapy的cookie是類似與json的形式,不像平常在requests上直接貼上就可以用,需要轉換一下格式。
scrapy實現新浪微博爬蟲
大概就是像這樣,所以需要把登入後的cookie貼出來用程式碼轉換一下,程式碼如下:

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

應該來說一個cookie差不多夠用,我這我儲存的是三個cookie,多個cookie簡單的方法是把多個cookie直接放在一個陣列裡面,每次請求的時候用random函數隨機挑一個出來,當然這只是針對採一批資料就撤的情況,大規模必須維護一個帳號池。請求的時候帶上ua,和cookie。如下:
scrapy實現新浪微博爬蟲
微博是以oid區分每個用戶的,我們以吳彥祖微博為例,在微博搜尋介面搜尋吳彥祖,進入主頁右鍵查看網頁原始碼我們可以看到:
scrapy實現新浪微博爬蟲
此處的oid就是每個使用者的唯一識別。對應使用者的主頁網址即為https://weibo.com oid,
有了位址,我們直接進入微網誌介面進行擷取即可,拼湊出url位址,例如:
https://weibo. com/wuyanzu?is_all=1&stat_date=201712#feedtop
這是吳彥祖2017年12月份的微博,我們不難發現,只要改變stat_date後面的數字即為對應微博地址。對於某些微博量比較多的用戶,月份的微博可能還涉及到js再加載一次,當然,我們高冷的男神吳彥祖先生肯定是不會發那麼多的,我們再找一個微博量比較大的自媒體,例如:
scrapy實現新浪微博爬蟲
可以看到,剩下的微博是需要透過js非同步載入來呈現給使用者的。開啟瀏覽器開發者模式,
scrapy實現新浪微博爬蟲
scrapy實現新浪微博爬蟲

對比兩次js載入的頁面,我們不難發現,Request_URL差別的地方僅僅是在pagebar和_rnd兩個參數上,第一個代表頁數,第二個是時間的加密(測試不帶上也無妨),因此我們僅僅需要構建頁數即可。有些微博量巨多的可能還需要翻頁,道理相同。

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中文網其他相關文章!

陳述:
本文轉載於:csdn.net。如有侵權,請聯絡admin@php.cn刪除