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

爬虫—爬取知乎热榜内容并进行图片爬取 1.文本内容爬取与网页分析过程
我们通过开发者工具对网页源码进行查看
进行网页爬取的第一步是获取网页的源代码,因为知乎存在一定的反爬取措施,所以我们要进行模拟登陆,这里我们在模式下查找xhr形式的内容,找到我们需要的,还有user-agent的内容
接着我们使用库获取网页的源代码,代码如下
【python爬虫---爬取知乎热榜内容并进行图片爬取】#需要爬取的目标网页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)
接着就是对获取到的内容进行文本解析,还有相关爬取,获取到我们需要的内容
我们查看网页源码

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

文章插图
发现我们需要爬取的内容对应的代码
那么我们便利用库对内容进行解析获取,代码如下:
#对网页进行解析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 requestsfrom bs4 import BeautifulSoupimport timeimport osimport 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