python爬虫,为什么可以正常爬取数据,但程序还是走了为了提示报错而写的 except 里的内容?
为什么可以正常爬取数据,但程序还是走了为了提示报错而写的 except 里的内容?
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()
停止运行后,还报了两个错
之前一直用这个可以跑,就这几天突然出现了问题。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
应该是这里出现了问题,排查下这个i的取值范围是不是超过了affair或者view这两个数组的元素个数。
你只是朴素的认为自己的程序没有错,其实你抓到的只是一段js,并没有抓到网页的内容。
应该用selenium模拟浏览器动态加载才能请求到内容。
另外别搞while true,意义不大,你的ip地址应该已经被封了,再想大量请求到内容的话,尽量加个代理。