鱼C论坛

 找回密码
 立即注册
查看: 1505|回复: 9

[已解决]我想获取知乎热榜的排行榜并保存到excel 可是excel那里出来问题 请大神们帮帮忙

[复制链接]
发表于 2020-3-27 22:51:27 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
我想获取知乎热榜的排行榜并保存到excel 可是excel那里出来问题 请大神们帮帮忙

  1. from lxml import etree
  2. import requests
  3. import openpyxl


  4. def get_url(url):
  5.    
  6.    
  7.     headers = {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36",
  8.                        'Cookie':'_zap=99431b2c-8767-4685-b98b-cd9d0d3d88cd; _xsrf=5p5XGCN215CjXjnbPuj1OmbQmvR2pQdQ; d_c0="AKDg7kP8dxCPTsNRshHIPT2mH69mOZb8xuE=|1575709991"; z_c0="2|1:0|10:1575709998|4:z_c0|92:Mi4xa2poTkNBQUFBQUFBb09EdVFfeDNFQ1lBQUFCZ0FsVk5MYnZZWGdEZ0xuLWJoVWFzV2ZtYjk4T2M3dHNYa1lRd1dn|ab32d6e8ac6c6c86e72b218ad426d24b26d9adea21fdbd28afe64ada5ac53e77"; _ga=GA1.2.2089582079.1583647145; q_c1=5919a9b1025f437f8105f1a16a9f0d36|1583647148000|1575710038000; _gid=GA1.2.633099727.1584344528; tst=h; tshl=; Hm_lvt_98beee57fd2ef70ccdd5ca52b9740c49=1584357660,1584362899,1584406978,1584411187; Hm_lpvt_98beee57fd2ef70ccdd5ca52b9740c49=1584420694; KLBRSID=53650870f91603bc3193342a80cf198c|1584420984|1584420275'}

  9.     ret = requests.get(url, headers=headers)
  10.     ret.encoding = 'GBK'
  11.     html_str = ret.content.decode()
  12.     html = etree.HTML(html_str)
  13.     res  = html.xpath("//section[@class='HotItem']")

  14.     return res

  15. #获取知乎热榜排名、标题、热度
  16. def get_data(res):
  17.    
  18.     for table in res:
  19.         data = {}
  20.         data['排名'] = table.xpath(".//div[@class='HotItem-index']/div/text()")
  21.         data['标题'] = table.xpath(".//div[@class='HotItem-content']/a/h2/text()")
  22.         data['热度'] = table.xpath(".//div[@class='HotItem-metrics HotItem-metrics--bottom']/text()")
  23.         data['地址'] = table.xpath(".//div[@class='HotItem-content']/a/@href")

  24.         return data
  25.    
  26. def to_excel(data):
  27.     wb = openpyxl.Workbook()
  28.     wb.guess_types = True
  29.     ws = wb.active
  30.     ws.append(['排名', '标题', '热度', '地址'])
  31.     for each in data:
  32.         ws.append(each)

  33.         wb.save("知乎热榜排行榜.xlsx")

  34. def main():
  35.     url = "https://www.zhihu.com/hot"
  36.     res = get_url(url)
  37.     data = get_data(res)
  38.     to_excel(data)
  39.    

  40.    
  41. if __name__ == "__main__":
  42.     main()
复制代码
最佳答案
2020-3-28 21:14:04
我给你改完了代码,完全爬出来了50个,应该只是第一页,,本来想先让你写一下的,算了
  1. from lxml import etree
  2. import requests
  3. import openpyxl


  4. def get_url(url):
  5.    
  6.    
  7.     headers = {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36",
  8.                        'Cookie':'_zap=99431b2c-8767-4685-b98b-cd9d0d3d88cd; _xsrf=5p5XGCN215CjXjnbPuj1OmbQmvR2pQdQ; d_c0="AKDg7kP8dxCPTsNRshHIPT2mH69mOZb8xuE=|1575709991"; z_c0="2|1:0|10:1575709998|4:z_c0|92:Mi4xa2poTkNBQUFBQUFBb09EdVFfeDNFQ1lBQUFCZ0FsVk5MYnZZWGdEZ0xuLWJoVWFzV2ZtYjk4T2M3dHNYa1lRd1dn|ab32d6e8ac6c6c86e72b218ad426d24b26d9adea21fdbd28afe64ada5ac53e77"; _ga=GA1.2.2089582079.1583647145; q_c1=5919a9b1025f437f8105f1a16a9f0d36|1583647148000|1575710038000; _gid=GA1.2.633099727.1584344528; tst=h; tshl=; Hm_lvt_98beee57fd2ef70ccdd5ca52b9740c49=1584357660,1584362899,1584406978,1584411187; Hm_lpvt_98beee57fd2ef70ccdd5ca52b9740c49=1584420694; KLBRSID=53650870f91603bc3193342a80cf198c|1584420984|1584420275'}

  9.     ret = requests.get(url, headers=headers)
  10.     ret.encoding = 'GBK'
  11.     html_str = ret.content.decode()
  12.     html = etree.HTML(html_str)
  13.     res  = html.xpath("//section[@class='HotItem']")

  14.     return res

  15. #获取知乎热榜排名、标题、热度
  16. def get_data(table):
  17.     data = {}
  18.     data['排名'] = str(table.xpath(".//div[@class='HotItem-index']/div/text()"))
  19.     data['标题'] = str(table.xpath(".//div[@class='HotItem-content']/a/h2/text()"))
  20.     data['热度'] = str(table.xpath(".//div[@class='HotItem-metrics HotItem-metrics--bottom']/text()"))
  21.     data['地址'] = str(table.xpath(".//div[@class='HotItem-content']/a/@href"))
  22.     return data
  23.    
  24. def to_excel(res):
  25.     wb = openpyxl.Workbook()
  26.     wb.guess_types = True
  27.     ws = wb.active
  28.     ws.append(['排名', '标题', '热度', '地址'])
  29.     i = 0
  30.     for table in res:
  31.         data = get_data(table)
  32.         i +=1
  33.         j = 0
  34.         for each in data:
  35.             j += 1
  36.             _=ws.cell(column=j,row=i+1,value=data[each])

  37.     wb.save("C:\\Users\\Chysial\\Desktop\\知乎热榜排行榜.xlsx")


  38. url = "https://www.zhihu.com/hot"
  39. res = get_url(url)
  40. to_excel(res)
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-3-28 15:15:24 | 显示全部楼层
出了什么问题
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-28 15:38:24 | 显示全部楼层
本帖最后由 Chysial 于 2020-3-28 16:10 编辑

我运行的结果是typeerror,说是ValueError: Cannot convert ['1'] to Excel,应该是爬虫哪个地方要进行字符串转化,由于你的openpyxl和我习惯不一样,我吧后边的代码改了一下
这是我给你修改后的代码
  1. from lxml import etree
  2. import requests
  3. import openpyxl


  4. def get_url(url):
  5.    
  6.    
  7.     headers = {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36",
  8.                        'Cookie':'_zap=99431b2c-8767-4685-b98b-cd9d0d3d88cd; _xsrf=5p5XGCN215CjXjnbPuj1OmbQmvR2pQdQ; d_c0="AKDg7kP8dxCPTsNRshHIPT2mH69mOZb8xuE=|1575709991"; z_c0="2|1:0|10:1575709998|4:z_c0|92:Mi4xa2poTkNBQUFBQUFBb09EdVFfeDNFQ1lBQUFCZ0FsVk5MYnZZWGdEZ0xuLWJoVWFzV2ZtYjk4T2M3dHNYa1lRd1dn|ab32d6e8ac6c6c86e72b218ad426d24b26d9adea21fdbd28afe64ada5ac53e77"; _ga=GA1.2.2089582079.1583647145; q_c1=5919a9b1025f437f8105f1a16a9f0d36|1583647148000|1575710038000; _gid=GA1.2.633099727.1584344528; tst=h; tshl=; Hm_lvt_98beee57fd2ef70ccdd5ca52b9740c49=1584357660,1584362899,1584406978,1584411187; Hm_lpvt_98beee57fd2ef70ccdd5ca52b9740c49=1584420694; KLBRSID=53650870f91603bc3193342a80cf198c|1584420984|1584420275'}

  9.     ret = requests.get(url, headers=headers)
  10.     ret.encoding = 'GBK'
  11.     html_str = ret.content.decode()
  12.     html = etree.HTML(html_str)
  13.     res  = html.xpath("//section[@class='HotItem']")

  14.     return res

  15. #获取知乎热榜排名、标题、热度
  16. def get_data(res):
  17.    
  18.     for table in res:
  19.         data = {}
  20.         data['排名'] = str(table.xpath(".//div[@class='HotItem-index']/div/text()"))
  21.         data['标题'] = str(table.xpath(".//div[@class='HotItem-content']/a/h2/text()"))
  22.         data['热度'] = str(table.xpath(".//div[@class='HotItem-metrics HotItem-metrics--bottom']/text()"))
  23.         data['地址'] = str(table.xpath(".//div[@class='HotItem-content']/a/@href"))

  24.         return data
  25.    
  26. def to_excel(data):
  27.     wb = openpyxl.Workbook()
  28.     wb.guess_types = True
  29.     ws = wb.active
  30.     i = 0
  31.     for each in data:
  32.         i += 1
  33.         _=ws.cell(column=1,row=i,value=each)
  34.         _=ws.cell(column=2,row=i,value=data[each])

  35.     wb.save("C:\\Users\\Chysial\\Desktop\\知乎热榜排行榜.xlsx")


  36. url = "https://www.zhihu.com/hot"
  37. res = get_url(url)
  38. data = get_data(res)
  39. to_excel(data)
  40.    
复制代码

这是最终excel的结果
排名        ['1']
标题        ['如何看待 3 月 28 日美国新冠肺炎确诊人数突破 10 万?']
热度        ['6332 万热度']
地址        ['https://www.zhihu.com/question/382855006']
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-28 17:50:47 | 显示全部楼层

是data那个类型的问题 我想知道要怎么改 (刚刚才看到你发的贴子
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-28 17:53:15 | 显示全部楼层
Chysial 发表于 2020-3-28 15:38
我运行的结果是typeerror,说是ValueError: Cannot convert ['1'] to Excel,应该是爬虫哪个地方要进行字符 ...

谢谢你的帮忙,但是为什么只有一条结果
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-28 20:24:04 | 显示全部楼层
13714309891 发表于 2020-3-28 17:53
谢谢你的帮忙,但是为什么只有一条结果

我对requests不是很熟,应该是爬虫的问题,就像find与find_all的,你再仔细看看request,我今天晚上有事,就不翻文档了,你自己找找看看,是不是这个爬虫只爬一条,先打印出来看看看,如果是,改一下,然后就在最后to_excel加一层循环就ok了。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-28 21:14:04 | 显示全部楼层    本楼为最佳答案   
我给你改完了代码,完全爬出来了50个,应该只是第一页,,本来想先让你写一下的,算了
  1. from lxml import etree
  2. import requests
  3. import openpyxl


  4. def get_url(url):
  5.    
  6.    
  7.     headers = {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36",
  8.                        'Cookie':'_zap=99431b2c-8767-4685-b98b-cd9d0d3d88cd; _xsrf=5p5XGCN215CjXjnbPuj1OmbQmvR2pQdQ; d_c0="AKDg7kP8dxCPTsNRshHIPT2mH69mOZb8xuE=|1575709991"; z_c0="2|1:0|10:1575709998|4:z_c0|92:Mi4xa2poTkNBQUFBQUFBb09EdVFfeDNFQ1lBQUFCZ0FsVk5MYnZZWGdEZ0xuLWJoVWFzV2ZtYjk4T2M3dHNYa1lRd1dn|ab32d6e8ac6c6c86e72b218ad426d24b26d9adea21fdbd28afe64ada5ac53e77"; _ga=GA1.2.2089582079.1583647145; q_c1=5919a9b1025f437f8105f1a16a9f0d36|1583647148000|1575710038000; _gid=GA1.2.633099727.1584344528; tst=h; tshl=; Hm_lvt_98beee57fd2ef70ccdd5ca52b9740c49=1584357660,1584362899,1584406978,1584411187; Hm_lpvt_98beee57fd2ef70ccdd5ca52b9740c49=1584420694; KLBRSID=53650870f91603bc3193342a80cf198c|1584420984|1584420275'}

  9.     ret = requests.get(url, headers=headers)
  10.     ret.encoding = 'GBK'
  11.     html_str = ret.content.decode()
  12.     html = etree.HTML(html_str)
  13.     res  = html.xpath("//section[@class='HotItem']")

  14.     return res

  15. #获取知乎热榜排名、标题、热度
  16. def get_data(table):
  17.     data = {}
  18.     data['排名'] = str(table.xpath(".//div[@class='HotItem-index']/div/text()"))
  19.     data['标题'] = str(table.xpath(".//div[@class='HotItem-content']/a/h2/text()"))
  20.     data['热度'] = str(table.xpath(".//div[@class='HotItem-metrics HotItem-metrics--bottom']/text()"))
  21.     data['地址'] = str(table.xpath(".//div[@class='HotItem-content']/a/@href"))
  22.     return data
  23.    
  24. def to_excel(res):
  25.     wb = openpyxl.Workbook()
  26.     wb.guess_types = True
  27.     ws = wb.active
  28.     ws.append(['排名', '标题', '热度', '地址'])
  29.     i = 0
  30.     for table in res:
  31.         data = get_data(table)
  32.         i +=1
  33.         j = 0
  34.         for each in data:
  35.             j += 1
  36.             _=ws.cell(column=j,row=i+1,value=data[each])

  37.     wb.save("C:\\Users\\Chysial\\Desktop\\知乎热榜排行榜.xlsx")


  38. url = "https://www.zhihu.com/hot"
  39. res = get_url(url)
  40. to_excel(res)
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-28 21:15:54 | 显示全部楼层
Chysial 发表于 2020-3-28 21:14
我给你改完了代码,完全爬出来了50个,应该只是第一页,,本来想先让你写一下的,算了

你的错误是哪个字典,因为很多个,形成的不是单一地映射了,出现了这种问题,只有一个,我是这么改的 你可以尝试一下用字典改,那么循环不是在to_excel中了,而是在get_table,你试一下吧
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-28 21:21:37 | 显示全部楼层
无标题.png
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-28 23:10:13 | 显示全部楼层

非常感谢!!!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-9 10:16

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表