import requests
from lxml import etree
import csv
from datetime import datetime
import time
def doSth():
try:
# 1.目標 url。
url = 'https://s.weibo.com/top/summary?cate=realtimehot'
# 模擬瀏覽器請求頭
headers = {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36'}
# 2.發送請求
data = requests.get(url, headers=headers).text
# 轉換
html = etree.HTML(data)
# 3.決議資料 xpath 取出來的資料是一個串列。
# 排名
rank = html.xpath('//td[@class="td-01 ranktop"]/text()')
# 事件
affair = html.xpath('//td[@class="td-02"]/a/text()')
affair.pop(0) # 忽略微博熱搜的置頂推薦內容。 # .pop(n) :洗掉串列第 n+1 個元素。
# 熱度
view = html.xpath('//td[@class="td-02"]/span/text()')
# 鏈接
link = html.xpath('//tr/td/a/@href')
link_try = html.xpath('//tr/td/a/@href_to')
link.pop(0)
# 處理鏈接資料(因為鏈接的 html 位置可能存在不同的地方,所以做了以下判斷)
index = 0
for i, sku in enumerate(link): # 這里的 i 和 sku 是什么?這里的 i 和最后保存時最后的代碼里的 i 一樣嗎?
if sku == "javascript:void(0);":
link[i] = link_try[index]
index += 1
# 4.保存資料為 csv。
date = datetime.now().strftime('%Y-%m-%d %H-%M-%S')
with open('./' + date + '.csv', 'w', newline='', encoding='utf-8-sig')as f:
writer = csv.writer(f)
writer.writerow(['排名', '事件', '熱度', '鏈接'])
for i, rank in enumerate(rank):
writer.writerow([rank, affair[i], view[i], 'https://s.weibo.com' + link[i]])
# 5.睡眠120秒。
time.sleep(120)
except:
print(time.strftime("%Y-%m-%d %X"))
print("requests speed so high,need sleep!")
time.sleep(10)
print("continue...")
while True:
doSth()
為什么可以正常爬取資料,但程式還是走了為了提示報錯而寫的 except 里的內容?
而且還有兩個報錯

以前明明都正常為什么這幾天就不行了?
uj5u.com熱心網友回復:
匹配規則不行,分析頁面,有一兩個隱藏的熱搜,表面上是看不到的,但是現在的匹配規則可以匹配出來,但是隱藏的熱搜是沒有熱度值的,所以導致后面的結果,排名, 事件, 熱度, 鏈接四個指標里面少了一部分熱度,各個串列長度不一致,所以會報錯,解決方法:在匹配后得到的結果里面把隱藏的那些事件洗掉,或者給它加上一個熱度值為0uj5u.com熱心網友回復:
改進后的代碼(45行-51行為新加的):
import requests
from lxml import etree
import csv
from datetime import datetime
import time
import copy
def doSth():
try:
# 1.目標 url。
url = 'https://s.weibo.com/top/summary?cate=realtimehot'
# 模擬瀏覽器請求頭
headers = {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36'}
# 2.發送請求
data = requests.get(url, headers=headers).text
# 轉換
html = etree.HTML(data)
# 3.決議資料 xpath 取出來的資料是一個串列。
# 排名
rank = html.xpath('//td[@class="td-01 ranktop"]/text()')
# 事件
affair = html.xpath('//td[@class="td-02"]/a/text()')
affair.pop(0) # 忽略微博熱搜的置頂推薦內容。 # .pop(n) :洗掉串列第 n+1 個元素。
# 熱度
view = html.xpath('//td[@class="td-02"]/span/text()')
# 鏈接
link = html.xpath('//td/a/@href')
link_try = html.xpath('//td/a/@href_to')
link.pop(0)
# 處理鏈接資料(因為鏈接的 html 位置可能存在不同的地方,所以做了以下判斷)
index = 0
for i, sku in enumerate(link): # 這里的 i 和 sku 是什么?這里的 i 和最后保存時最后的代碼里的 i 一樣嗎?
if sku == "javascript:void(0);":
link[i] = link_try[index]
index += 1
# 4.保存資料為 csv。
date = datetime.now().strftime('%Y-%m-%d %H-%M-%S')
# 洗掉沒有熱度的熱搜(隱藏的熱搜)
rank_new = copy.deepcopy(rank)
for r in range(len(rank_new)):
if not rank_new[r].isdigit():
rank.remove(rank_new[r])
del affair[r]
del link[r]
with open('./' + date + '.csv', 'w', newline='', encoding='utf-8-sig')as f:
writer = csv.writer(f)
writer.writerow(['排名', '事件', '熱度', '鏈接'])
for i, rank in enumerate(rank):
writer.writerow([rank, affair[i], view[i], 'https://s.weibo.com' + link[i]])
# 5.睡眠120秒。
time.sleep(120)
except:
print(time.strftime("%Y-%m-%d %X"))
print("requests speed so high,need sleep!")
time.sleep(10)
print("continue...")
while True:
doSth()
如果我的回答對你有幫助的話,請結貼為我評分吧!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/284684.html
下一篇:Python
