日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

新浪微博爬虫设计(Python版)

發布時間:2023/12/2 python 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 新浪微博爬虫设计(Python版) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

最近手頭上有一個項目,是關于新浪微博的,其中有一環要做新浪微博的爬蟲。雖然之前把《Python學習手冊》和《Python核心編程》都囫圇吞栆地通讀完了,不過真正到做項目的時候還是什么都不會。于是在網上找了大量的資料。關于獲取新浪微博的內容,大致有兩種方法,一種是用純爬蟲,還有一種是用新浪提供的API。

使用API的話,需要先申請一個新浪的開發帳號,這個過程有一點復雜,最終目的是獲得新浪的app_key和app_secret。通過引導用戶授權,獲得access_token,再調用API。雖然新浪提供的API便于開發者開發,不過其限制也是很大的。首先就是用戶必須授權,自從新浪接口升級后,很多接口只有對授權的用戶使用才有效,像friends_timeline,user_timeline這些獲取用戶微博的,還有很多其他的接口都有這樣的限制。除此以外,access_token有所謂的有效期,開發者為5年,而其他人的話,如果授權級別是測試則只有一天,普通則是7天,具體可看官網介紹。也就是說,超過有效期的話就要重新授權,挺麻煩的。除了這些外,其實它對接口訪問的頻次也是有限制的。就我們這個項目而言,因為要獲取的微博信息與地理位置有關,用API的話不太方便。雖然我花了不少時間研究API,不過最終還是放棄了。

最后我決定使用爬蟲來做,感謝以下文章給我提供的思路:

http://blog.csdn.net/codingmirai/article/details/17754645

這篇文章的作者用的是JAVA語言,不過他給我提供了一個很好的想法。他并未用到模擬登錄,用的是代理IP,不過在最新的文章中他也說到,新浪因為進行了升級,所以代理IP不能用了,只能進行模擬登錄。于是,我又要感謝以下文章的作者:

http://www.jb51.net/article/44779.htm

他幫我解決了模擬登錄的問題,主要是通過模擬登錄來保存cookies,這我在之后會介紹。

當然在實際做的過程中還是有不少問題的,像是要通過正則表達式來解析html,坑爹的新浪微博的網頁源碼中文字是以utf-8的形式出現的,也就是像‘\u4f60\u7684‘的形式出現的,看的時候麻煩的不得了,一度讓人情緒失控。具體解析方法我會在之后的文中介紹,同時給出源代碼。


順便說一下,本人的編譯環境:Linux,Python 2.7版本。一切的源代碼都是在這個環境中測試的,如有不同的系統,或是Python3.X版本的請自行修改。。。


這是v1版本,之后可能會進行修改,也可能會做圖形化界面。。。

第一次制作,難免有不足之處,歡迎提出意見。。


文件不多,Main.py:主文件;Matcher.py:解析html;WeiboLogin.py,WeiboEncode.py,WeiboSearch.py:用于模擬登錄;還有一個userlists文件存放用戶名和密碼,這是為了防止新浪的反爬蟲功能,之后我會介紹(不過并不完美)


主函數(Main.py):

#!/usr/bin/env?python
#-*-coding:utf-8-*-

from?WeiboLogin?import?WeiboLogin
import?re
import?urllib2
import?Matcher

def?main():
????urlheader=’http://s.weibo.com/weibo/’
????para=raw_input(‘請輸入搜索內容:\n’)
????page=1
????userlists=open(‘userlists’).readlines()
????reg1=re.compile(r’\\u4f60\\u7684\\u884c\\u4e3a\\u6709\\u4e9b\\u5f02\\u5e38\\uff0c\\u8bf7\\u8f93\\u5165\\u9a8c\\u8bc1\\u7801\\uff1a’)????#你的行為有些異常,請輸入驗證碼
????reg2=re.compile(r’\\u62b1\\u6b49\\uff0c\\u672a\\u627e\\u5230′)#抱歉,未找到搜索結果
????for?userlist?in?userlists:
????????username=userlist.split()[0]
????????password=userlist.split()[1]
????????weibologin=WeiboLogin(username,password)
????????if?weibologin.Login()==True:
????????????print?‘登錄成功’
????????????user=True????#帳號可用
????????while?page<=50?and?user:
????????????url=urlheader+para+’&page=’+str(page)
????????????print?‘獲取第%d頁。。’?%?page
????????????f=urllib2.urlopen(url)
????????????###開始匹配網頁內容###
????????????for?line?in?f:
????????????????if?re.search(r’pid”:”pl_weibo_direct”‘,line):????#匹配一定要準確!!
????????????????????if?reg2.search(line):
????????????????????????print?‘抱歉,未找到結果。。。’
????????????????????????return
????????????????????else:????
????????????????????????Matcher.matcher(line)
????????????????????????page+=1
????????????????????????break
????????????????if?re.search(r’pid”:”pl_common_sassfilter’,line):
????????????????????if?reg1.search(line):
????????????????????????print?‘此帳號被鎖,使用下一個帳號’
????????????????????????user=False????#帳號不可用

if?__name__==’__main__':
????main()


首先,爬取的微博是通過輸入關鍵詞搜索到的含指定關鍵字的微博,也就是在:http://s.weibo.com這個網站上搜索到的微博。上文的reg1匹配的是“你的行為有些異常,請輸入驗證碼”。在這里我要解釋一下,新浪微博反爬蟲功能,當一次性搜索過多頁面時便會跳出這條信息,極限大概是30多頁,然后便會被這樣鎖住。我也嘗試過使用代理IP來做,不過會顯示登錄次數過多,致使無法登錄的情況。因此我的辦法便是使用多個帳號,當某個帳號被鎖住時便使用下一個,之后再人工去解鎖。這并不是一個好方法,我也還在嘗試其他方法,如果有誰有好的方法可以提供給我。

reg2匹配的是沒有找到含指定關鍵詞的微博信息。

在網頁源代碼中,含“pid”:”pl_weibo_direct”的一行就是搜索結果,所有搜索到的微博都在這一行上,之后只要針對這一行進行解析就可以了。如果某一行含有”pid”:”pl_common_sassfilter”則表示出現帳號被鎖的情況。


模擬登錄:

關于這部分可以查看上文的鏈接,或是本人的轉載博文:

http://liandesinian.blog.51cto.com/7737219/1549692(對應此項目)


解析網頁內容(Matcher.py):

#!/usr/bin/env?python#-*-coding:utf-8-*-

import?reimport?codecs

def?matcher(line):????reg=r'<em>(.*?)<\\/em>.*?allowForward=1&url=(.*?)&’#先將微博內容全部匹配下來,含url????sub=r’color:red’#子串????reg=re.compile(reg)????reg2=re.compile(‘<.*?>’)#去除其中的<…>????mats=reg.findall(line)????if?mats!='[]':????????for?mat?in?mats:????????????with?codecs.open(‘result.txt’,’a’,encoding=’utf-8′)?as?f:#寫入utf-8文件????????????????if?mat[0].find(sub)!=-1:#含有子串????????????????????t=reg2.sub(”,mat[0])#剔除其中的<…>????????????????????f.write(t.decode(‘unicode_escape’).replace(‘\\’,”)+’\n’)#去除”\”????????????????????f.write(u’單條微博信息:’)????????????????????f.write(mat[1].replace(‘\\’,”)+’\n\n’)

微博內容在<em>和<\/em>之間。首先先將所有的微博內容匹配下來,這里面可能包含轉載微博,而有些轉載微博都是不含指定關鍵詞的,所以需要剔除。


基本上現在就是這樣的,當然還有很多不足之處,尤其是如何應對新浪的反爬蟲功能,還需完善。。。


本文出自 “蓮的思念” 博客,請務必保留此出處http://liandesinian.blog.51cto.com/7737219/1549701

轉載請注明:「電腦玩物」中文網 ? 新浪微博爬蟲設計(Python版)

總結

以上是生活随笔為你收集整理的新浪微博爬虫设计(Python版)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。