本文目錄一覽:
- 1、怎樣用python爬新浪微博大V所有數據
- 2、python怎麼調用api接口
- 3、如何通過python調用新浪微博的API
- 4、python調用微博api的place接口出現10014錯誤,怎麼解決
- 5、如何用python寫出爬蟲?
怎樣用python爬新浪微博大V所有數據
我是個微博重度用戶,工作學習之餘喜歡刷刷timeline看看有什麼新鮮事發生,也因此認識了不少高質量的原創大V,有分享技術資料的,比如好東西傳送門;有時不時給你一點人生經驗的,比如石康;有高產的段子手,比如銀教授;有黃圖黃段子小能手,比如阿良哥哥 木木蘿希木 初犬餅…
好吧,我承認,爬黃圖黃段子才是我的真實目的,前三個是掩人耳目的…(捂臉,跑開)
另外說點題外話,我一開始想使用Sina Weibo API來獲取微博內容,但後來發現新浪微博的API限制實在太多,大家感受一下:
只能獲取當前授權的用戶(就是自己),而且只能返回最新的5條,WTF!
所以果斷放棄掉這條路,改為『生爬』,因為PC端的微博是Ajax的動態加載,爬取起來有些困難,我果斷知難而退,改為對移動端的微博進行爬取,因為移動端的微博可以通過分頁爬取的方式來一次性爬取所有微博內容,這樣工作就簡化了不少。
最後實現的功能:
輸入要爬取的微博用戶的user_id,獲得該用戶的所有微博
文字內容保存到以%user_id命名文本文件中,所有高清原圖保存在weibo_image文件夾中
具體操作:
首先我們要獲得自己的cookie,這裡只說chrome的獲取方法。
用chrome打開新浪微博移動端
option+command+i調出開發者工具
點開Network,將Preserve log選項選中
輸入賬號密碼,登錄新浪微博
找到m.weibo.cn-Headers-Cookie,把cookie複製到代碼中的#your cookie處
cookie
然後再獲取你想爬取的用戶的user_id,這個我不用多說啥了吧,點開用戶主頁,地址欄裡面那個號碼就是user_id
將python代碼保存到weibo_spider.py文件中
定位到當前目錄下後,命令行執行python weibo_spider.py user_id
當然如果你忘記在後面加user_id,執行的時候命令行也會提示你輸入
最後執行結束
iTerm
小問題:在我的測試中,有的時候會出現圖片下載失敗的問題,具體原因還不是很清楚,可能是網速問題,因為我宿舍的網速實在太不穩定了,當然也有可能是別的問題,所以在程序根目錄下面,我還生成了一個userid_imageurls的文本文件,裡面存儲了爬取的所有圖片的下載鏈接,如果出現大片的圖片下載失敗,可以將該鏈接群一股腦導進迅雷等下載工具進行下載。
另外,我的系統是OSX EI Capitan10.11.2,Python的版本是2.7,依賴庫用sudo pip install XXXX就可以安裝,具體配置問題可以自行stackoverflow,這裡就不展開講了。
下面我就給出實現代碼(嚴肅臉)
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
#-*-coding:utf8-*-
import re
import string
import sys
import os
import urllib
import urllib2
from bs4 import BeautifulSoup
import requests
from lxml import etree
reload(sys)
sys.setdefaultencoding(‘utf-8’)
if(len(sys.argv) =2):
user_id = (int)(sys.argv[1])
else:
user_id = (int)(raw_input(u”請輸入user_id: “))
cookie = {“Cookie”: “#your cookie”}
url = ‘d?filter=1page=1’%user_id
html = requests.get(url, cookies = cookie).content
selector = etree.HTML(html)
pageNum = (int)(selector.xpath(‘//input[@name=”mp”]’)[0].attrib[‘value’])
result = “”
urllist_set = set()
word_count = 1
image_count = 1
print u’爬蟲準備就緒…’
for page in range(1,pageNum+1):
#獲取lxml頁面
url = ‘hu/%d?filter=1page=%d’%(user_id,page)
lxml = requests.get(url, cookies = cookie).content
#文字爬取
selector = etree.HTML(lxml)
content = selector.xpath(‘//span[@class=”ctt”]’)
for each in content:
text = each.xpath(‘string(.)’)
if word_count = 4:
text = “%d :”%(word_count-3) +text+”\n\n”
else :
text = text+”\n\n”
result = result + text
word_count += 1
#圖片爬取
soup = BeautifulSoup(lxml, “lxml”)
urllist = soup.find_all(‘a’,href=re.compile(r’^mblog/oripic’,re.I))
first = 0
for imgurl in urllist:
urllist_set.add(requests.get(imgurl[‘href’], cookies = cookie).url)
image_count +=1
fo = open(“/Users/Personals/%s”%user_id, “wb”)
fo.write(result)
word_path=os.getcwd()+’/%d’%user_id
print u’文字微博爬取完畢’
link = “”
fo2 = open(“/Users/Personals/%s_imageurls”%user_id, “wb”)
for eachlink in urllist_set:
link = link + eachlink +”\n”
fo2.write(link)
print u’圖片鏈接爬取完畢’
if not urllist_set:
print u’該頁面中不存在圖片’
else:
#下載圖片,保存在當前目錄的pythonimg文件夾下
image_path=os.getcwd()+’/weibo_image’
if os.path.exists(image_path) is False:
os.mkdir(image_path)
x=1
for imgurl in urllist_set:
temp= image_path + ‘/%s.jpg’ % x
print u’正在下載第%s張圖片’ % x
try:
urllib.urlretrieve(urllib2.urlopen(imgurl).geturl(),temp)
except:
print u”該圖片下載失敗:%s”%imgurl
x+=1
print u’原創微博爬取完畢,共%d條,保存路徑%s’%(word_count-4,word_path)
print u’微博圖片爬取完畢,共%d張,保存路徑%s’%(image_count-1,image_path)
python怎麼調用api接口
調用windows API的方式其實有兩種,第一種是通過第三方模塊pywin32。
如果小夥伴安裝了pip,可以通過pip安裝pywin32
在命令行中運行pip pst查看是否安裝了pywin32
如圖
我們這裡調用一個windows最基本的API,MessageBox,該接口可以顯示一個對話框。
這裡小編就不過多介紹了,只簡單的描述MessageBox接口,MessageBox是windows的一個API接口,作用是顯示一個對話框。
原型為:
int WINAPI MessageBox(HWND hWnd,LPCTSTR lpText,LPCTSTR lpCaption,UINT uType);
第一個參數hWnd,指明了該對話框屬於哪個窗口,lpText為窗口提示信息,lpCaption則為窗口標題,uType則是定義對話框的按鈕和圖標。
這裡我們需要導入win32api這個模塊(隸屬於pywin32),如果需要宏定義的,API的宏被定義在win32con(同隸屬於pywin32)模塊內。
這裡我們只導入一個win32api模塊,然後簡單的調用MessageBox顯示一個對話框即可。
如果我們不會安裝pywin32模塊,或者說不想安裝這個三方模塊。這時我們還有一個辦法。
調用python內置模塊ctypes,如果小夥伴有windows編程基礎的話,或者看過一點MSDN的話,都該知道,Windows的API其實是以dll文件(動態鏈接庫)方式存在的。
+和|效果是相同的
更多Python相關技術文章,請訪問Python教程欄目進行學習!以上就是小編分享的關於python怎麼調用api接口的詳細內容希望對大家有所幫助,更多有關python教程請關注環球青藤其它相關文章!
如何通過python調用新浪微博的API
1.下載SDK
使用python調用API的話,首先要去下一個Python的SDK,sinaweibopy
連接地址在此:
可以使用pip很快的導入,github連接里的wiki也有入門的使用方法,很容易看懂。
2.理解新浪微博的授權機制
在調用API之前,首先要搞懂什麼叫OAuth 2,即新浪微博的授權機制,
連接在此:
3.在新浪微博註冊應用
每個人都可以通過新浪微博開發者平台註冊自己的應用,我註冊的是站內應用。註冊後會為每個應用分配唯一的app key 和 app secret,這在上文提到的授權機制中需要用到,相當與每個應用的標示吧。
至此,我們可以嘗試寫代碼調用新浪微博的API啦。
4.簡單的調用API實例
參考了往上很多資料和文檔,寫了一個簡單的調用過程。
# _*_ coding: utf-8 _*_
from weibo import APIClient
import webbrowser
APP_KEY = ”
APP_SECRET = ”
CALLBACK_URL = ”
#這個是設置回調地址,必須與那個”高級信息“里的一致
client = APIClient(app_key=APP_KEY, app_secret=APP_SECRET, redirect_uri=CALLBACK_URL)
url = client.get_authorize_url()
# TODO: redirect to url
#print url
webbrowser.open_new(url)
# 獲取URL參數code:
code = ‘2fc0b2f5d2985db832fa01fee6bd9316’
client = APIClient(app_key=APP_KEY, app_secret=APP_SECRET, redirect_uri=CALLBACK_URL)
r = client.request_access_token(code)
access_token = r.access_token # 新浪返回的token,類似abc123xyz456
expires_in = r.expires_in # token過期的UNIX時間:
# TODO: 在此可保存access token
client.set_access_token(access_token, expires_in)
print client.friendships.friends.bilateral.ids.get(uid = 12345678)
通過以上的代碼,我實現了調用相互關注API的調用,即查找與某個id的用戶相互關注的人的列表。
其中,APP_KEY和APP_SECRET就是前文中分配給每個應用的信息,回調地址在每個應用的高級信息中可以看到,需要自己設置,不過隨便設置一下就好
比較噁心的是code的獲取,我一開始看sinaweibopy的文檔的時候也沒弄懂是什麼意思,如上面的代碼所示,url得到的是一個授權的網址,我們通過
webbrowser.open_new(url)
這行代碼打開瀏覽器跳轉到授權的界面,然後觀察所在界面的網址,會顯示大概如下一樣的格式:
看到了嗎? 問號後面有一個code=……的一個東西,把等號後面的字符串拷貝下來賦給code就可以了,但是每次運行程序是code不是一成不變的,也就是說每次都要有這麼一個手動獲取的過程,我覺得很麻煩,以後自己再研究一下,實現自動獲取code就好了。如果能有哪位大神告訴我,感激不盡~
好了,得到正確的code之後就可以完成授權認證,也就可以調用微博的API啦,至於如何在Python下調用,我拷貝一下sinaweibopy上的介紹:
首先查看新浪微博API文檔,例如:
API:statuses/user_timeline
請求格式:GET
請求參數:
source:string,採用OAuth授權方式不需要此參數,其他授權方式為必填參數,數值為應用的AppKey?。
access_token:string,採用OAuth授權方式為必填參數,其他授權方式不需要此參數,OAuth授權後獲得。
uid:int64,需要查詢的用戶ID。
screen_name:string,需要查詢的用戶昵稱。
(其它可選參數略)
調用方法:將API的“/”變為“.”,根據請求格式是GET或POST,調用get ()或post()並傳入關鍵字參數,但不包括source和access_token參數:
r = client.statuses.user_timeline.get(uid=123456)
for st in r.statuses:
print st.text
若為POST調用,則示例代碼如下:
r = client.statuses.update.post(status=u’測試OAuth 2.0發微博’)
若需要上傳文件,傳入file-like object參數,示例代碼如下:
f = open(‘/Users/michael/test.png’, ‘rb’)
r = client.statuses.upload.post(status=u’測試OAuth 2.0帶圖片發微博’, pic=f)
f.close() # APIClient不會自動關閉文件,需要手動關閉
請注意:上傳的文件必須是file-like object,不能是str,因為無法區分一個str是文件還是字段。可以通過StringIO把一個str包裝成file-like object
希望我的回答對你有幫助,望採納。
python調用微博api的place接口出現10014錯誤,怎麼解決
一:獲取app-key 和 app-secret
使用自己的微博賬號登錄微博開放平台(),在微博開放中心下“創建應用”創建一個應用,應用信息那些隨便填,填寫完畢後,不需要提交審核,需要的只是那個app-key和app-secret
二:設置授權回調頁
在“微博開放平台”的“管理中心”找到剛才創建的應用,點開這個應用,點開左邊“應用信息”欄,會看見“App key”和“App Secret”的字樣,這兩個東西是要在後面程序中使用的。然後在“應用信息”下的“高級信息”點擊“編輯”按鈕,將“授權回調頁面”設置為:,將“取消授權回調頁”也設置為:。
三:安裝微博 python SDK
有兩種安裝方式:
1:下載新浪微博SDK
2:python有個簡單的安裝方式:直接在命令行下鍵入:
[python] view plain copy
sudo pip install sinaweibopy
四:實例驗證,獲取當前登錄用戶及其所關注(授權)用戶的最新微博
這裡需要注意的是在瀏覽器彈出一個頁面,要先點擊“授權”(這裡進行的OAuth 2認證,我理解為就是用戶訪問我的應用後將頁面導向新浪服務器然後用戶輸入信息到新浪服務器後授權給我的應用訪問用戶數據,這裡我將的微博授權給下面的程序了),授權後瀏覽器中的URL類似:將code後面那個複製到控制端,程序需要讀入2024222384d5dc88316d21675259d73a這個數據
注意:如果想獲取別的信息,只需修改
[python] view plain copy
statuses = client.statuses__friends_timeline()[‘statuses’]
中的 statuses__friends_timeline即可
[python] view plain copy
# -*- coding: utf-8 -*-
from weibo import APIClient
import webbrowser #python內置的包
APP_KEY = ‘xxxxxxxx’#注意替換這裡為自己申請的App信息
APP_SECRET = ‘xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx’
CALLBACK_URL = ”#回調授權頁面
#利用官方微博SDK
client = APIClient(app_key=APP_KEY, app_secret=APP_SECRET, redirect_uri=CALLBACK_URL)
#得到授權頁面的url,利用webbrowser打開這個url
url = client.get_authorize_url()
print url
webbrowser.open_new(url)
#獲取code=後面的內容
print ‘輸入url中code後面的內容後按回車鍵:’
code = raw_input()
#code = your.web.framework.request.get(‘code’)
#client = APIClient(app_key=APP_KEY, app_secret=APP_SECRET, redirect_uri=CALLBACK_URL)
r = client.request_access_token(code)
access_token = r.access_token # 新浪返回的token,類似abc123xyz456
expires_in = r.expires_in
# 設置得到的access_token
client.set_access_token(access_token, expires_in)
#可以打印下看看裡面都有什麼東西
statuses = client.statuses__friends_timeline()[‘statuses’] #獲取當前登錄用戶以及所關注用戶(已授權)的微博/span
length = len(statuses)
print length
#輸出了部分信息
for i in range(0,length):
print u’昵稱:’+statuses[i][‘user’][‘screen_name’]
print u’簡介:’+statuses[i][‘user’][‘description’]
print u’位置:’+statuses[i][‘user’][‘location’]
print u’微博:’+statuses[i][‘text’]
結果如下(截取部分數據):
以下為我的關注用戶的微博:
拿上邊代碼為例,這裡我們獲取的信息有:
如何用python寫出爬蟲?
先檢查是否有API
API是網站官方提供的數據接口,如果通過調用API採集數據,則相當於在網站允許的範圍內採集,這樣既不會有道德法律風險,也沒有網站故意設置的障礙;不過調用API接口的訪問則處於網站的控制中,網站可以用來收費,可以用來限制訪問上限等。整體來看,如果數據採集的需求並不是很獨特,那麼有API則應優先採用調用API的方式。
數據結構分析和數據存儲
爬蟲需求要十分清晰,具體表現為需要哪些字段,這些字段可以是網頁上現有的,也可以是根據網頁上現有的字段進一步計算的,這些字段如何構建表,多張表如何連接等。值得一提的是,確定字段環節,不要只看少量的網頁,因為單個網頁可以缺少別的同類網頁的字段,這既有可能是由於網站的問題,也可能是用戶行為的差異,只有多觀察一些網頁才能綜合抽象出具有普適性的關鍵字段——這並不是幾分鐘看幾個網頁就可以決定的簡單事情,如果遇上了那種臃腫、混亂的網站,可能坑非常多。
對於大規模爬蟲,除了本身要採集的數據外,其他重要的中間數據(比如頁面Id或者url)也建議存儲下來,這樣可以不必每次重新爬取id。
數據庫並沒有固定的選擇,本質仍是將Python里的數據寫到庫里,可以選擇關係型數據庫MySQL等,也可以選擇非關係型數據庫MongoDB等;對於普通的結構化數據一般存在關係型數據庫即可。sqlalchemy是一個成熟好用的數據庫連接框架,其引擎可與Pandas配套使用,把數據處理和數據存儲連接起來,一氣呵成。
數據流分析
對於要批量爬取的網頁,往上一層,看它的入口在哪裡;這個是根據採集範圍來確定入口,比如若只想爬一個地區的數據,那從該地區的主頁切入即可;但若想爬全國數據,則應更往上一層,從全國的入口切入。一般的網站網頁都以樹狀結構為主,找到切入點作為根節點一層層往裡進入即可。
值得注意的一點是,一般網站都不會直接把全量的數據做成列表給你一頁頁往下翻直到遍歷完數據,比如鏈家上面很清楚地寫着有24587套二手房,但是它只給100頁,每頁30個,如果直接這麼切入只能訪問3000個,遠遠低於真實數據量;因此先切片,再整合的數據思維可以獲得更大的數據量。顯然100頁是系統設定,只要超過300個就只顯示100頁,因此可以通過其他的篩選條件不斷細分,只到篩選結果小於等於300頁就表示該條件下沒有缺漏;最後把各種條件下的篩選結果集合在一起,就能夠儘可能地還原真實數據量。
明確了大規模爬蟲的數據流動機制,下一步就是針對單個網頁進行解析,然後把這個模式複製到整體。對於單個網頁,採用抓包工具可以查看它的請求方式,是get還是post,有沒有提交表單,欲採集的數據是寫入源代碼里還是通過AJAX調用JSON數據。
同樣的道理,不能只看一個頁面,要觀察多個頁面,因為批量爬蟲要弄清這些大量頁面url以及參數的規律,以便可以自動構造;有的網站的url以及關鍵參數是加密的,這樣就悲劇了,不能靠着明顯的邏輯直接構造,這種情況下要批量爬蟲,要麼找到它加密的js代碼,在爬蟲代碼上加入從明文到密碼的加密過程;要麼採用下文所述的模擬瀏覽器的方式。
數據採集
之前用R做爬蟲,不要笑,R的確可以做爬蟲工作;但在爬蟲方面,Python顯然優勢更明顯,受眾更廣,這得益於其成熟的爬蟲框架,以及其他的在計算機系統上更好的性能。scrapy是一個成熟的爬蟲框架,直接往裡套用就好,比較適合新手學習;requests是一個比原生的urllib包更簡潔強大的包,適合作定製化的爬蟲功能。requests主要提供一個基本訪問功能,把網頁的源代碼給download下來。一般而言,只要加上跟瀏覽器同樣的Requests Headers參數,就可以正常訪問,status_code為200,並成功得到網頁源代碼;但是也有某些反爬蟲較為嚴格的網站,這麼直接訪問會被禁止;或者說status為200也不會返回正常的網頁源碼,而是要求寫驗證碼的js腳本等。
下載到了源碼之後,如果數據就在源碼中,這種情況是最簡單的,這就表示已經成功獲取到了數據,剩下的無非就是數據提取、清洗、入庫。但若網頁上有,然而源代碼里沒有的,就表示數據寫在其他地方,一般而言是通過AJAX異步加載JSON數據,從XHR中找即可找到;如果這樣還找不到,那就需要去解析js腳本了。
解析工具
源碼下載後,就是解析數據了,常用的有兩種方法,一種是用BeautifulSoup對樹狀HTML進行解析,另一種是通過正則表達式從文本中抽取數據。
BeautifulSoup比較簡單,支持Xpath和CSSSelector兩種途徑,而且像Chrome這類瀏覽器一般都已經把各個結點的Xpath或者CSSSelector標記好了,直接複製即可。以CSSSelector為例,可以選擇tag、id、class等多種方式進行定位選擇,如果有id建議選id,因為根據HTML語法,一個id只能綁定一個標籤。
正則表達式很強大,但構造起來有點複雜,需要專門去學習。因為下載下來的源碼格式就是字符串,所以正則表達式可以大顯身手,而且處理速度很快。
對於HTML結構固定,即同樣的字段處tag、id和class名稱都相同,採用BeautifulSoup解析是一種簡單高效的方案,但有的網站混亂,同樣的數據在不同頁面間HTML結構不同,這種情況下BeautifulSoup就不太好使;如果數據本身格式固定,則用正則表達式更方便。比如以下的例子,這兩個都是深圳地區某個地方的經度,但一個頁面的class是long,一個頁面的class是longitude,根據class來選擇就沒辦法同時滿足2個,但只要注意到深圳地區的經度都是介於113到114之間的浮點數,就可以通過正則表達式”11[3-4].\d+”來使兩個都滿足。
數據整理
一般而言,爬下來的原始數據都不是清潔的,所以在入庫前要先整理;由於大部分都是字符串,所以主要也就是字符串的處理方式了。
字符串自帶的方法可以滿足大部分簡單的處理需求,比如strip可以去掉首尾不需要的字符或者換行符等,replace可以將指定部分替換成需要的部分,split可以在指定部分分割然後截取一部分。
如果字符串處理的需求太複雜以致常規的字符串處理方法不好解決,那就要請出正則表達式這個大殺器。
Pandas是Python中常用的數據處理模塊,雖然作為一個從R轉過來的人一直覺得這個模仿R的包實在是太難用了。Pandas不僅可以進行向量化處理、篩選、分組、計算,還能夠整合成DataFrame,將採集的數據整合成一張表,呈現最終的存儲效果。
寫入數據庫
如果只是中小規模的爬蟲,可以把最後的爬蟲結果匯合成一張表,最後導出成一張表格以便後續使用;但對於表數量多、單張表容量大的大規模爬蟲,再導出成一堆零散的表就不合適了,肯定還是要放在數據庫中,既方便存儲,也方便進一步整理。
寫入數據庫有兩種方法,一種是通過Pandas的DataFrame自帶的to_sql方法,好處是自動建表,對於對錶結構沒有嚴格要求的情況下可以採用這種方式,不過值得一提的是,如果是多行的DataFrame可以直接插入不加索引,但若只有一行就要加索引否則報錯,雖然這個認為不太合理;另一種是利用數據庫引擎來執行SQL語句,這種情況下要先自己建表,雖然多了一步,但是表結構完全是自己控制之下。Pandas與SQL都可以用來建表、整理數據,結合起來使用效率更高。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/151523.html