首页 >> 大全

python爬虫---爬取知乎热榜内容并进行图片爬取

2023-11-06 大全 30 作者:考证青年

爬虫—爬取知乎热榜内容并进行图片爬取 1.文本内容爬取与网页分析过程

我们通过开发者工具对网页源码进行查看

进行网页爬取的第一步是获取网页的源代码,因为知乎存在一定的反爬取措施,所以我们要进行模拟登陆,这里我们在模式下查找xhr形式的内容,找到我们需要的,还有user-agent的内容

接着我们使用库获取网页的源代码,代码如下

#需要爬取的目标网页
link='https://www.zhihu.com/hot'
#设置代理,防止被反爬虫手段检测到
hd={"cookie": "_zap=3eb5cecf-10ea-4113-b786-424c37987678; d_c0='ALBnAsAOLBCPTocgg1QrgZQPTQipsrg82go=|1570614563'; _xsrf=1ffe9e33-8a31-4531-9a32-7034c53d93da; Hm_lvt_98beee57fd2ef70ccdd5ca52b9740c49=1572535112,1572535430,1573462873,1573463033; capsion_ticket='2|1:0|10:1573463033|14:capsion_ticket|44:MWM2N2Q2ZTliZDIyNGQ4Yzk5MjBmM2I4NzllOWU5Y2U=|75cb423ecfabb6c68610d5af3a315d9f65252263e24e6ea73434bbb11231e7b2'; l_n_c=1; r_cap_id='ODJjMDI3ZGJiMDRmNDJlOWFlOTg0Zjk4ZWVlMDdlMWI=|1573463036|c97eb1ff4c0aba5be696b743050daf77d5da79ac'; cap_id='OTRlZGY1YTdhOWEzNDFhOWEzNjdhMWU2N2VlYTUxYmM=|1573463036|38cb4f4a3342159b32c40d93c7807b23ea1cc799'; l_cap_id='OGQyZmM3NDJlMjIxNDU2NGFiYmFlZDcxMmZkNGU4NDc=|1573463036|a63b7e8659dd330aae1aa7a3149421bf800c7010'; n_c=1; z_c0=Mi4xX2VkZUFnQUFBQUFBc0djQ3dBNHNFQmNBQUFCaEFsVk5GWEsyWGdEdzNaVzhyMWlOLU1pNURxeFNud3VtVUJCVnhB|1573463062|6b9d8c8ee3c751873020534ee705e70a17f923b4; tst=h; tshl=; Hm_lpvt_98beee57fd2ef70ccdd5ca52b9740c49=1573463095; tgw_l7_route=79c5a098af080bf343c0c50ae917961f",'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36'}
#获取网页源代码
r=requests.get(link,headers=hd)

接着就是对获取到的内容进行文本解析,还有相关爬取,获取到我们需要的内容

我们查看网页源码

_知乎数据爬取_爬虫爬知乎教程

发现我们需要爬取的内容对应的代码

那么我们便利用库对内容进行解析获取,代码如下:

#对网页进行解析
soup=BeautifulSoup(r.text,'lxml')
#获取到热榜对应的那部分内容
title_list=soup.find_all('section',class_='HotItem')#循环爬取相关内容
for each in title_list:i+=1index=each.find('div',class_='HotItem-rank').text#排名title=each.find('h2',class_='HotItem-title').text#标题number=each.find('div',class_="HotItem-metrics").text[0:-3]#热度print(index,title,number)

实现效果如下:

2.实现图片爬取

爬取到了文本内容,那么接下来我们就可以进行图片爬取

首先,我们需要找到图片链接

我们分析网页源码,找到这部分对应的内容

和爬取文本内容相似,我们获取到图片链接

link=each.find(class_='HotItem-img').find(name='img')#图片链接

接着我们使用库中的通过链接下载图片

实现代码如下:

try:if(link['src'][-4]=='.'):urllib.request.urlretrieve(link['src'],'C:/Users/Administrator/Desktop/知乎图片/'+str(i)+'.%s'%title+link['src'][-4:]);else:urllib.request.urlretrieve(link['src'],'C:/Users/Administrator/Desktop/知乎图片/'+str(i)+'.%s'%title+link['src'][-5:]);

实现效果如下:

3.完整程序附录

以下是完整程序:


import requests
from bs4 import BeautifulSoup
import time
import os
import urllib
#设置图片存储路径
position='C:/Users/Administrator/Desktop/知乎图片/'
i=0
#需要爬取的目标网页
link='https://www.zhihu.com/hot'
#设置代理,防止被反爬虫手段检测到
hd={"cookie": "_zap=3eb5cecf-10ea-4113-b786-424c37987678; d_c0='ALBnAsAOLBCPTocgg1QrgZQPTQipsrg82go=|1570614563'; _xsrf=1ffe9e33-8a31-4531-9a32-7034c53d93da; Hm_lvt_98beee57fd2ef70ccdd5ca52b9740c49=1572535112,1572535430,1573462873,1573463033; capsion_ticket='2|1:0|10:1573463033|14:capsion_ticket|44:MWM2N2Q2ZTliZDIyNGQ4Yzk5MjBmM2I4NzllOWU5Y2U=|75cb423ecfabb6c68610d5af3a315d9f65252263e24e6ea73434bbb11231e7b2'; l_n_c=1; r_cap_id='ODJjMDI3ZGJiMDRmNDJlOWFlOTg0Zjk4ZWVlMDdlMWI=|1573463036|c97eb1ff4c0aba5be696b743050daf77d5da79ac'; cap_id='OTRlZGY1YTdhOWEzNDFhOWEzNjdhMWU2N2VlYTUxYmM=|1573463036|38cb4f4a3342159b32c40d93c7807b23ea1cc799'; l_cap_id='OGQyZmM3NDJlMjIxNDU2NGFiYmFlZDcxMmZkNGU4NDc=|1573463036|a63b7e8659dd330aae1aa7a3149421bf800c7010'; n_c=1; z_c0=Mi4xX2VkZUFnQUFBQUFBc0djQ3dBNHNFQmNBQUFCaEFsVk5GWEsyWGdEdzNaVzhyMWlOLU1pNURxeFNud3VtVUJCVnhB|1573463062|6b9d8c8ee3c751873020534ee705e70a17f923b4; tst=h; tshl=; Hm_lpvt_98beee57fd2ef70ccdd5ca52b9740c49=1573463095; tgw_l7_route=79c5a098af080bf343c0c50ae917961f",'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36'}
#获取网页源代码
r=requests.get(link,headers=hd)
#对网页进行解析
soup=BeautifulSoup(r.text,'lxml')
#获取到热榜对应的那部分内容
title_list=soup.find_all('section',class_='HotItem')#循环爬取相关内容
for each in title_list:i+=1index=each.find('div',class_='HotItem-rank').text#排名title=each.find('h2',class_='HotItem-title').text#标题number=each.find('div',class_="HotItem-metrics").text[0:-3]#热度print(index,title,number)#因为部分没有图片,使用使用try,except结构try:link=each.find(class_='HotItem-img').find(name='img')#图片链接except:continue;#检测是否存在目标文件夹,没有就创建一个if not os.path.isdir(position):os.makedirs(position)#图片类型有很多种,.jpg,.png...结尾的就使用第一个存储,其他使用第二种try:if(link['src'][-4]=='.'):urllib.request.urlretrieve(link['src'],'C:/Users/Administrator/Desktop/知乎图片/'+str(i)+'.%s'%title+link['src'][-4:]);else:urllib.request.urlretrieve(link['src'],'C:/Users/Administrator/Desktop/知乎图片/'+str(i)+'.%s'%title+link['src'][-5:]);except:continue

当然以上程序存在一点问题,比如gif图没有爬取到,个别图片有问题…没有排查出来,有兴趣的可以着手解决一下。

关于我们

最火推荐

小编推荐

联系我们


版权声明:本站内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 88@qq.com 举报,一经查实,本站将立刻删除。备案号:桂ICP备2021009421号
Powered By Z-BlogPHP.
复制成功
微信号:
我知道了