摘要:于是去網(wǎng)上搜一下,搜索結(jié)果都是前兩年爬取微博的方法,那時(shí)候還是用以格式傳遞,現(xiàn)在明顯已經(jīng)不是。其他的屬性是一些微博的標(biāo)題發(fā)送時(shí)間內(nèi)容點(diǎn)贊數(shù)評(píng)論數(shù)轉(zhuǎn)發(fā)數(shù)和博主相關(guān)信息等。
網(wǎng)友:看看胸
女:滾網(wǎng)友:美胸比賽
女:[圖片消息] ????
繼上次知乎話題 擁有一副好身材是怎樣的體驗(yàn)? 解析了知乎回答內(nèi)容之后,這次我們來(lái)解析一下微博內(nèi)容,以微博網(wǎng)友發(fā)起的美胸大賽為例:
https://m.weibo.cn/detail/4367970740108457
https://m.weibo.cn/detail/4348022520956497
這就是本次要獲取的微博圖片內(nèi)容,共計(jì)672張很兇的照片:
下面是講如何獲取的,不感興趣的話直接去公眾號(hào)回復(fù) 套圖 即可獲得。
首先進(jìn)入開(kāi)發(fā)者工具看一下微博結(jié)構(gòu):
這只是一小部分,微博評(píng)論和微博用戶(hù)發(fā)的微博頁(yè)面,里面都是以html5格式傳到本地的,把內(nèi)容格式化之后就會(huì)發(fā)現(xiàn),層級(jí)非常復(fù)雜,有興趣的可以看一下,與其解析這個(gè)還不如用selenium更簡(jiǎn)單一些。于是當(dāng)時(shí)就產(chǎn)生了兩個(gè)思路:
借助 splash 直接解析渲染后的頁(yè)面
用 mitmproxy 抓手機(jī)APP微博的包,用 APPium 控制手機(jī)刷新評(píng)論
不管是哪一種,相對(duì)于只是獲取一下圖片而言都麻煩。于是去網(wǎng)上搜一下,搜索結(jié)果都是前兩年爬取微博的方法,那時(shí)候還是用 ajax 以 json 格式傳遞,現(xiàn)在明顯已經(jīng)不是。
然后后面抱著僥幸心理把訪問(wèn)形式改成手機(jī),微博域名就從 weibo.com 變成了 weibo.cn,再看一下 network 選項(xiàng)卡以hotflow 開(kāi)頭的 xhr :
這時(shí)候 weibo.cn 傳給本地信息就是簡(jiǎn)單的 json 格式啦。上圖就是微博評(píng)論列表的評(píng)論,可以看到每條評(píng)論如果有圖片,就會(huì)有 pic 屬性,但是要注意在 pic 下的 直接子 url 只是預(yù)覽圖鏈接,并非原圖。原圖鏈接在pic 屬性下 large 下的 url。其他的屬性是一些微博的標(biāo)題、發(fā)送時(shí)間、內(nèi)容、點(diǎn)贊數(shù)、評(píng)論數(shù)、轉(zhuǎn)發(fā)數(shù)和博主相關(guān)信息等。我們這次重點(diǎn)是圖片,就不管其他的了。
另外微博的反爬措施很強(qiáng),真的惡心到我了,如果有大規(guī)模爬取需求,建議去淘寶買(mǎi)號(hào),建 Cookie池,或者用代理池不停地切換訪問(wèn)主機(jī)。如果只用自己電腦本地Cookie,那就把請(qǐng)求頭弄全,并限制抓取速度。
切換到 Headers 選項(xiàng)卡,看一下 Request URL :
https://m.weibo.cn/comments/hotFlowChild?cid=4376866645060411&max_id=152030087630286&max_id_type=0
可以看出它的格式是
https://m.weibo.cn/comments/hotFlowChild? + cid + max_id + max_id_type"
其中 cid 是每一條微博的唯一ID,max_id 是下一次傳回?cái)?shù)據(jù)的最后一條評(píng)論的 ID。也就是往下翻看評(píng)論,每次顯示十條,并在這次所看的評(píng)論里就傳回 下十條評(píng)論 的最后一條評(píng)論的唯一 ID,微博是根據(jù)這個(gè) ID 傳回下十條內(nèi)容。這也就直接限制了每次爬評(píng)論、微博、二級(jí)評(píng)論時(shí)只能一次獲取十條,也無(wú)法利用線程池加速,因?yàn)橹挥蝎@取了這十條才知道下十條請(qǐng)求地址里 max_id 的值。
然后就可以由這些信息構(gòu)造請(qǐng)求,獲取 json 格式的響應(yīng)結(jié)果:
comment_url = "https://m.weibo.cn/comments/hotflow?id={weibo_id}&mid={weibo_id}&max_id={max_id}&max_id_type=0" url = comment_url.format(weibo_id=id, max_id=0) response = requests.get(url, headers=headers) result = json.loads(response.text)
先獲取總評(píng)論數(shù)來(lái)計(jì)算需要多少次才能爬完評(píng)論:
total_number = result.get("data").get("total_number") total_number = int(total_number) for i in range(int(total_number / 10)): result = get_page(weibo_id) for url in parse_comment(result): save_to_img(url)
下載完圖片只有700來(lái)張才知道靠后的評(píng)論都是無(wú)用的(男士跟答主要聯(lián)系方式什么的)評(píng)論。
然后就是獲取圖片地址:
def parse_comment(result): if result.get("ok") and result.get("data").get("data"): comments = result.get("data").get("data") for comment in comments: if comment.get("pic"): url = comment.get("pic").get("large").get("url") yield url
要先 if comment.get("pic") 一下,這很重要,因?yàn)楹芏酂o(wú)用評(píng)論并沒(méi)有配圖,也就是沒(méi)有 pic 屬性,要以這種方式過(guò)濾掉。
另外還有這個(gè):
這里的二級(jí)評(píng)論就很有必要爬一下,看一下結(jié)構(gòu):
值得注意的是二級(jí)評(píng)論里不管有沒(méi)有圖片都不會(huì)有 pic 屬性,圖片在回答內(nèi)容text 里以 css 方式嵌套的,很明顯就是 a 標(biāo)簽下的 href 屬性 就是圖片地址。用 pyquery 取出來(lái)地址:
childs_comment = result.get("data") for child_comment in childs_comment: text = child_comment.get("text") content = pyquery.PyQuery(text) url = content("a").attr("href") yield url
存儲(chǔ)圖片以圖片內(nèi)容的 md5 值命名,可以去重:
response = requests.get(url) if response.status_code == 200:img_path = "{0}/{1}.{2}".format(path,md5(response.content).hexdigest(), "jpg") # 以圖片的md5字符串命名防止重復(fù)圖片
最后接入某大廠的人體特征值檢測(cè),考慮到圖片大多沒(méi)有露臉,識(shí)別男女性別不夠準(zhǔn),這里只把未識(shí)別出人體的圖片去掉了(一些表情圖)。
有興趣的可以公眾號(hào)回復(fù) 套圖 獲得這次微博圖片和上次知乎圖片本次微博結(jié)構(gòu)比較簡(jiǎn)單,與上次關(guān)于知乎的文章差不多,不再提供源碼。
公眾號(hào):愛(ài)寫(xiě)bug(ID:iCodeBugs)
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/45152.html
摘要:本人長(zhǎng)期出售超大量微博數(shù)據(jù)旅游網(wǎng)站評(píng)論數(shù)據(jù),并提供各種指定數(shù)據(jù)爬取服務(wù),。如果用戶(hù)傳入偽造的,則新浪微博會(huì)返回一個(gè)錯(cuò)誤。 PS:(本人長(zhǎng)期出售超大量微博數(shù)據(jù)、旅游網(wǎng)站評(píng)論數(shù)據(jù),并提供各種指定數(shù)據(jù)爬取服務(wù),Message to YuboonaZhang@Yahoo.com。由于微博接口更新后限制增大,這個(gè)代碼已經(jīng)不能用來(lái)爬數(shù)據(jù)了。如果只是為了收集數(shù)據(jù)可以咨詢(xún)我的郵箱,如果是為了學(xué)習(xí)爬蟲(chóng),...
摘要:本人長(zhǎng)期出售超大量微博數(shù)據(jù)旅游網(wǎng)站評(píng)論數(shù)據(jù),并提供各種指定數(shù)據(jù)爬取服務(wù),。如果用戶(hù)傳入偽造的,則新浪微博會(huì)返回一個(gè)錯(cuò)誤。 PS:(本人長(zhǎng)期出售超大量微博數(shù)據(jù)、旅游網(wǎng)站評(píng)論數(shù)據(jù),并提供各種指定數(shù)據(jù)爬取服務(wù),Message to YuboonaZhang@Yahoo.com。由于微博接口更新后限制增大,這個(gè)代碼已經(jīng)不能用來(lái)爬數(shù)據(jù)了。如果只是為了收集數(shù)據(jù)可以咨詢(xún)我的郵箱,如果是為了學(xué)習(xí)爬蟲(chóng),...
摘要:時(shí)間永遠(yuǎn)都過(guò)得那么快,一晃從年注冊(cè),到現(xiàn)在已經(jīng)過(guò)去了年那些被我藏在收藏夾吃灰的文章,已經(jīng)太多了,是時(shí)候把他們整理一下了。那是因?yàn)槭詹貖A太亂,橡皮擦給設(shè)置私密了,不收拾不好看呀。 ...
摘要:前言利用實(shí)現(xiàn)抓取微博評(píng)論數(shù)據(jù),廢話不多說(shuō)。讓我們愉快地開(kāi)始吧開(kāi)發(fā)工具版本相關(guān)模塊模塊模塊模塊模塊模塊以及一些自帶的模塊。環(huán)境搭建安裝并添加到環(huán)境變量,安裝需要的相關(guān)模塊即可。 ...
閱讀 1891·2021-11-11 16:55
閱讀 2095·2021-10-08 10:13
閱讀 752·2019-08-30 11:01
閱讀 2162·2019-08-29 13:19
閱讀 3288·2019-08-28 18:18
閱讀 2626·2019-08-26 13:26
閱讀 586·2019-08-26 11:40
閱讀 1877·2019-08-23 17:17