微博熱搜的爬取較為簡單,我只是用了lxml和requests兩個庫
url=https://s.weibo.com/top/summary?Refer=top_hot&topnav=1&wvr=6
1.分析網頁的源代碼:右鍵--查看網頁源代碼.
從網頁代碼中可以獲取到信息
(1)熱搜的名字都在<td class="td-02">的子節點<a>里
(2)熱搜的排名都在<td class=td-01 ranktop>的里(注意置頂微博是沒有排名的!)
(3)熱搜的訪問量都在<td class="td-02">的子節點<span>里
2.requests獲取網頁
(1)先設置url地址,然后模擬瀏覽器(這一步可以不用)防止被認出是爬蟲程序。
###網址 url="https://s.weibo.com/top/summary?Refer=top_hot&topnav=1&wvr=6" ###模擬瀏覽器,這個請求頭windows下都能用 header={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36'}
(2)利用requests庫的get()和lxml的etree()來獲取網頁代碼
###獲取html頁面 html=etree.HTML(requests.get(url,headers=header).text)
3.構造xpath路徑
上面第一步中三個xath路徑分別是:
affair=html.xpath('//td[@class="td-02"]/a/text()') rank=html.xpath('//td[@class="td-01 ranktop"]/text()') view=html.xpath('//td[@class="td-02"]/span/text()')
xpath的返回結果是列表,所以affair、rank、view都是字符串列表
4.格式化輸出
需要注意的是affair中多了一個置頂熱搜,我們先將他分離出來。
top=affair[0]
affair=affair[1:]
這里利用了python的切片。
print('{0:<10}\t{1:<40}'.format("top",top)) for i in range(0, len(affair)): print("{0:<10}\t{1:{3}<30}\t{2:{3}>20}".format(rank[i],affair[i],view[i],chr(12288)))
這里還是沒能做到完全對齊。。。
5.全部代碼
###導入模塊 import requests from lxml import etree ###網址 url="https://s.weibo.com/top/summary?Refer=top_hot&topnav=1&wvr=6" ###模擬瀏覽器 header={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36'} ###主函數 def main(): ###獲取html頁面 html=etree.HTML(requests.get(url,headers=header).text) rank=html.xpath('//td[@class="td-01 ranktop"]/text()') affair=html.xpath('//td[@class="td-02"]/a/text()') view = html.xpath('//td[@class="td-02"]/span/text()') top=affair[0] affair=affair[1:] print('{0:<10}\t{1:<40}'.format("top",top)) for i in range(0, len(affair)): print("{0:<10}\t{1:{3}<30}\t{2:{3}>20}".format(rank[i],affair[i],view[i],chr(12288))) main()
結果展示: