一个简单的python爬虫,爬取知乎

  • 主要实现 爬取一个收藏夹 里 所有问题答案下的 图片
  • 文字信息暂未收录,可自行实现,比图片更简单
  • 具体代码里有详细注释,请自行阅读

项目源码:

 # -*- coding:utf-8 -*-

 from spider import SpiderHTML
from multiprocessing import Pool
import sys,urllib,http,os,random,re,time
__author__ = 'waiting'
'''
使用了第三方的类库 BeautifulSoup4,请自行安装
需要目录下的spider.py文件
运行环境:python3.4,windows7
''' #收藏夹的地址
url = 'https://www.zhihu.com/collection/30822111' #page参数改为代码添加 #本地存放的路径,不存在会自动创建
store_path = 'E:\\zhihu\收藏夹\\会员才知道的世界' class zhihuCollectionSpider(SpiderHTML):
def __init__(self,pageStart, pageEnd, url):
self._url = url
self._pageStart = int(pageStart)
self._pageEnd = int(pageEnd)+1
self.downLimit = 0 #低于此赞同的答案不收录 def start(self):
for page in range(self._pageStart,self._pageEnd): #收藏夹的页数
url = self._url + '?page='+str(page)
content = self.getUrl(url)
questionList = content.find_all('div',class_='zm-item')
for question in questionList: #收藏夹的每个问题
Qtitle = question.find('h2',class_='zm-item-title')
if Qtitle is None: #被和谐了
continue questionStr = Qtitle.a.string
Qurl = 'https://www.zhihu.com'+Qtitle.a['href'] #问题题目
Qtitle = re.sub(r'[\\/:*?"<>]','#',Qtitle.a.string) #windows文件/目录名不支持的特殊符号
try:
print('-----正在获取问题:'+Qtitle+'-----') #获取到问题的链接和标题,进入抓取
except UnicodeEncodeError:
print(r'---问题含有特殊字符无法显示---')
try:
Qcontent = self.getUrl(Qurl)
except:
print('!!!!获取出错!!!!!')
pass
answerList = Qcontent.find_all('div',class_='zm-item-answer zm-item-expanded')
self._processAnswer(answerList,Qtitle) #处理问题的答案
time.sleep(5) def _processAnswer(self,answerList,Qtitle):
j = 0
for answer in answerList:
j = j + 1 upvoted = int(answer.find('span',class_='count').string.replace('K','')) #获得此答案赞同数
if upvoted < self.downLimit:
continue
authorInfo = answer.find('div',class_='zm-item-answer-author-info') #获取作者信息
author = {'introduction':'','link':''}
try:
author['name'] = authorInfo.find('a',class_='author-link').string #获得作者的名字
author['introduction'] = str(authorInfo.find('span',class_='bio')['title']) #获得作者的简介
author['link'] = authorInfo.find('a',class_='author-link')['href']
except AttributeError:
author['name'] = '匿名用户'+str(j)
except TypeError: #简介为空的情况
pass #匿名用户没有链接 file_name = os.path.join(store_path,Qtitle,'info',author['name']+'_info.txt')
if os.path.exists(file_name): #已经抓取过
continue self.saveText(file_name,'{introduction}\r\n{link}'.format(**author)) #保存作者的信息
print('正在获取用户`{name}`的答案'.format(**author))
answerContent = answer.find('div',class_='zm-editable-content clearfix')
if answerContent is None: #被举报的用户没有答案内容
continue imgs = answerContent.find_all('img')
if len(imgs) == 0: #答案没有上图
pass
else:
self._getImgFromAnswer(imgs,Qtitle,**author) #收录图片
def _getImgFromAnswer(self,imgs,Qtitle,**author):
i = 0
for img in imgs:
if 'inline-image' in img['class']: #不抓取知乎的小图
continue
i = i + 1
imgUrl = img['src']
extension = os.path.splitext(imgUrl)[1]
path_name = os.path.join(store_path,Qtitle,author['name']+'_'+str(i)+extension)
try:
self.saveImg(imgUrl,path_name) #捕获各种图片异常,流程不中断
except:
pass #收录文字
def _getTextFromAnswer(self):
pass #命令行下运行,例:zhihu.py 1 5 获取1到5页的数据
if __name__ == '__main__':
page, limit, paramsNum= 1, 0, len(sys.argv)
if paramsNum>=3:
page, pageEnd = sys.argv[1], sys.argv[2]
elif paramsNum == 2:
page = sys.argv[1]
pageEnd = page
else:
page,pageEnd = 1,1 spider = zhihuCollectionSpider(page,pageEnd,url)
spider.start()

很多初学者,对Python的概念都是模糊不清的,C语言、Python能做什么,学的时候,该按照什么线路去学习,学完往哪方面发展,想深入了解,详情可以点击有道云笔记链接了解:http://note.youdao.com/noteshare?id=e4fa02e7b56d7909a27674cdb3da08aa

一个简单的python爬虫,爬取知乎的更多相关文章

  1. 简单的python爬虫--爬取Taobao淘女郎信息

    最近在学Python的爬虫,顺便就练习了一下爬取淘宝上的淘女郎信息:手法简单,由于淘宝网站本上做了很多的防爬措施,应此效果不太好! 爬虫的入口:https://mm.taobao.com/json/r ...

  2. 一个简单的python爬虫程序

    python|网络爬虫 概述 这是一个简单的python爬虫程序,仅用作技术学习与交流,主要是通过一个简单的实际案例来对网络爬虫有个基础的认识. 什么是网络爬虫 简单的讲,网络爬虫就是模拟人访问web ...

  3. 用Python爬虫爬取广州大学教务系统的成绩(内网访问)

    用Python爬虫爬取广州大学教务系统的成绩(内网访问) 在进行爬取前,首先要了解: 1.什么是CSS选择器? 每一条css样式定义由两部分组成,形式如下: [code] 选择器{样式} [/code ...

  4. 使用Python爬虫爬取网络美女图片

    代码地址如下:http://www.demodashi.com/demo/13500.html 准备工作 安装python3.6 略 安装requests库(用于请求静态页面) pip install ...

  5. Python爬虫 - 爬取百度html代码前200行

    Python爬虫 - 爬取百度html代码前200行 - 改进版,  增加了对字符串的.strip()处理 源代码如下: # 改进版, 增加了 .strip()方法的使用 # coding=utf-8 ...

  6. Python爬虫爬取全书网小说,程序源码+程序详细分析

    Python爬虫爬取全书网小说教程 第一步:打开谷歌浏览器,搜索全书网,然后再点击你想下载的小说,进入图一页面后点击F12选择Network,如果没有内容按F5刷新一下 点击Network之后出现如下 ...

  7. python爬虫—爬取英文名以及正则表达式的介绍

    python爬虫—爬取英文名以及正则表达式的介绍 爬取英文名: 一.  爬虫模块详细设计 (1)整体思路 对于本次爬取英文名数据的爬虫实现,我的思路是先将A-Z所有英文名的连接爬取出来,保存在一个cs ...

  8. Python爬虫|爬取喜马拉雅音频

    "GOOD Python爬虫|爬取喜马拉雅音频 喜马拉雅是知名的专业的音频分享平台,用户规模突破4.8亿,汇集了有声小说,有声读物,儿童睡前故事,相声小品等数亿条音频,成为国内发展最快.规模 ...

  9. python爬虫爬取内容中,-xa0,-u3000的含义

    python爬虫爬取内容中,-xa0,-u3000的含义 - CSDN博客 https://blog.csdn.net/aiwuzhi12/article/details/54866310

随机推荐

  1. 常用UrlEncode编码结果

    空格 ! # $ % + @ : = ? %20 %21 %23 %24 %25 %2B %40 %3A %3D %3F

  2. 3ds Max File Format (Part 4: The first useful data; Scene, AppData, Animatable)

    The most interesting part of this file is, evidently, the Scene. Opening it up in the chunk parser, ...

  3. python:if else 语句

    #!/usr/bin/python# -*- coding:utf-8 -*- import os fileName1 = 'a.txt'if os.path.exists(fileName1): f ...

  4. Outlook365(Oulook2016 或2013) 写邮件输入收件人时的推荐联系人如何清理?

    · 在Outlook365(Oulook2016 或2013) 中写邮件,输入收件人邮箱地址时,会出现“最近联系人”  “其他建议”等推荐的联系人,可以方便选择.如果里面有很多邮箱地址的已经无效的话, ...

  5. 《TCP/IP入门经典》摘录--Part 3

    TCP/IP协议系统 3.子网划分和CIDR 子网 划分网络 为什么需要划分子网? 子网划分就是在网络 ID 之下提供了第 2 层逻辑组织.路由器能够把数据报发送给网络里的某个子网地址(一般对应于一个 ...

  6. Book: The TimeViz Browser

    website; A visual survey of visualization techniques for time-oriented data. 1. Left pannel ----- fi ...

  7. SSH多表操作入门

    这个系统写到这里,所涉及到的都是单表的操作,增删改查,现在功能需要完善,涉及到多表操作,开始是毫无头绪,书上的代码也没有现成的可以借鉴,想来就从最简单的开始.问题出现了很多,不过最后在龙哥的提示下还是 ...

  8. Leetcode 面试题 01.01. 判定字符是否唯一

    实现一个算法,确定一个字符串 s 的所有字符是否全都不同. 示例 1: 输入: s = "leetcode"输出: false 示例 2: 输入: s = "abc&qu ...

  9. vue -- v-model 表单绑定

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  10. js面向对象的程序设计 --- 中篇(创建对象) 之 原型模式

    ·原型模式 我们创建的每一个函数都由一个prototype(原型)属性,这个属性是一个指针,指向一个对象,而这个对象的用途是包含可以由特定类型的所有 实例共享的属性和方法. 如果按照字面意思来理解,那 ...