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

走远了吗. 提交于 2019-11-25 22:26:08

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

1.文本内容爬取与网页分析过程

我们通过开发者工具对网页源码进行查看
在这里插入图片描述
进行网页爬取的第一步是获取网页的源代码,因为知乎存在一定的反爬取措施,所以我们要进行模拟登陆,这里我们在network模式下查找xhr形式的内容,找到我们需要的cookie,还有user-agent的内容
在这里插入图片描述接着我们使用requests库获取网页的源代码,代码如下

#需要爬取的目标网页
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)

接着就是对获取到的内容进行文本解析,还有相关爬取,获取到我们需要的内容
我们查看网页源码
在这里插入图片描述
发现我们需要爬取的内容对应的代码
那么我们便利用BeautifulSoup库对内容进行解析获取,代码如下:

#对网页进行解析
soup=BeautifulSoup(r.text,'lxml')
#获取到热榜对应的那部分内容
title_list=soup.find_all('section',class_='HotItem')

#循环爬取相关内容
for each in title_list:
    i+=1
    index=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')#图片链接

接着我们使用urllib库中的urlretrieve通过链接下载图片
实现代码如下:

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+=1
    index=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图没有爬取到,个别图片有问题…没有排查出来,有兴趣的可以着手解决一下。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!