qq_29026149 2021-09-26 17:31 采纳率: 75%
浏览 436
已结题

微博热搜是爬取不了吗?

微博热搜是爬取不了吗?我检查了热搜的网页代码也没变啊,就是莫名其妙爬不了,也没有报错~


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; U; Intel Mac OS X 10_6_8; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50"}

        # 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()



  • 写回答

1条回答 默认 最新

  • RE_ABANDON 2021-09-27 15:14
    关注

    你调试看下返回的html,内容不对,自然xpath获取不到东西了

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 9月28日
  • 已采纳回答 9月27日
  • 赞助了问题酬金 9月27日
  • 创建了问题 9月26日

悬赏问题

  • ¥15 微信公众号自制会员卡没有收款渠道啊
  • ¥15 stable diffusion
  • ¥100 Jenkins自动化部署—悬赏100元
  • ¥15 关于#python#的问题:求帮写python代码
  • ¥20 MATLAB画图图形出现上下震荡的线条
  • ¥15 关于#windows#的问题:怎么用WIN 11系统的电脑 克隆WIN NT3.51-4.0系统的硬盘
  • ¥15 perl MISA分析p3_in脚本出错
  • ¥15 k8s部署jupyterlab,jupyterlab保存不了文件
  • ¥15 ubuntu虚拟机打包apk错误
  • ¥199 rust编程架构设计的方案 有偿