需求分析
抓取 琢磨先生的新浪微博
微博主頁
抓取的內容包括:微博發布的時間,正文(僅提取文字),轉發數,評論數,點贊數
抓取的內容
數據是怎么加載的
新浪微博的數據是用ajax異步下拉加載的,在chrome的調試模式下可捕捉到相應的請求:
xhr請求
分析這些url的規律:
https://m.weibo.cn/api/container/getIndex?type=uid&value=1665372775&containerid=1076031665372775&page=2
https://m.weibo.cn/api/container/getIndex?type=uid&value=1665372775&containerid=1076031665372775&page=3
發現除了page參數的不同,其他都是一致的
數據的結構分析
json結構分析
返回的json數據結構中,我們需要的是以下字段:
data
cards
mblog
created_at # 發布時間
text # 正文
reposts_count # 轉發數
comments_count # 評論數
attitudes_count # 點贊數
代碼實現
首先確保安裝了requests
和pyquery
庫
pip install pyquery
pip install requests
具體代碼解析:
import requests
from urllib.parse import urlencode
from pyquery import PyQuery as pq
host = 'm.weibo.cn'
base_url = 'https://%s/api/container/getIndex?' % host
user_agent = 'User-Agent: Mozilla/5.0 (iPhone; CPU iPhone OS 9_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13B143 Safari/601.1 wechatdevtools/0.7.0 MicroMessenger/6.3.9 Language/zh_CN webview/0'
headers = {
'Host': host,
'Referer': 'https://m.weibo.cn/u/1665372775',
'User-Agent': user_agent
}
# 按頁數抓取數據
def get_single_page(page):
params = {
'type': 'uid',
'value': 1665372775,
'containerid': 1076031665372775,
'page': page
}
url = base_url + urlencode(params)
try:
response = requests.get(url, headers=headers)
if response.status_code == 200:
return response.json()
except requests.ConnectionError as e:
print('抓取錯誤', e.args)
# 解析頁面返回的json數據
def parse_page(json):
items = json.get('data').get('cards')
for item in items:
item = item.get('mblog')
if item:
data = {
'id': item.get('id'),
'text': pq(item.get("text")).text(), # 僅提取內容中的文本
'attitudes': item.get('attitudes_count'),
'comments': item.get('comments_count'),
'reposts': item.get('reposts_count')
}
yield data
if __name__ == '__main__':
for page in range(1, 10): # 抓取前十頁的數據
json = get_single_page(page)
results = parse_page(json)
for result in results:
print(result)
運行結果
{'id': '4241354777389653', 'text': '【新書預售】\n\n我經常覺得生活就如同唐吉坷德,持一只長矛,去挑戰一個個風車。你越是勇敢,你就越是可笑。我們必須正確認識自己,認識自己手里的兵器,也要認清我們要去挑戰的是何種存在。\n\n這些風車有愛情,有親情,有友誼,有遠行,有閱讀,亦有人性...我把自己跌跌撞撞挑戰過的十八個風車,寫成了 ...全文', 'attitudes': 646, 'comments': 509, 'reposts': 155}
{'id': '4276572205338096', 'text': '雪橇犬,鳥,鯨魚,海豹,冰塊,人(最后一張)。 格陵蘭', 'attitudes': 35, 'comments': 18, 'reposts': 1}
{'id': '4276459473976711', 'text': '北極 微博視頻', 'attitudes': 196, 'comments': 39, 'reposts': 12}
{'id': '4276308663690970', 'text': '真好看,魅力十足//@zhj居安:媽呀!太好看了吧!保持的真好,羨慕呀!', 'attitudes': 379, 'comments': 91, 'reposts': 191}
{'id': '4276172055838171', 'text': '在高鐵渣男這件事上,我覺得乘警也必須要反思,如果不讓座,必須強制執行。如果乘警不作為,個體的乘客如何能解決自己權益收到傷害的情形,難不成都要靠自己的拳頭去解決問題?我們有些執法者的問題在于,該有善意的時候心狠,該心狠的時候又充滿了沒原則的善意。', 'attitudes': 3536, 'comments': 496, 'reposts': 601}
{'id': '4276152610951821', 'text': '惡心至極,不接受那虛偽的道歉,拉入高鐵黑名單吧。//@劉力博士://@楊伯溆:太不可思議了//@芮法:唯物史觀啊,哪有歷史唯物主義史觀之說。作者、編輯、刊物都太丟人了//@記錄者老K:他還是學法律的 查看圖片', 'attitudes': 407, 'comments': 287, 'reposts': 350}