Python爬取知乎图片代码实现解析


Posted in Python onSeptember 17, 2019

首先,需要获取任意知乎的问题,只需要你输入问题的ID,就可以获取相关的页面信息,比如最重要的合计有多少人回答问题。

问题ID为如下标红数字

编写代码,下面的代码用来检测用户输入的是否是正确的ID,并且通过拼接URL去获取该问题下面合计有多少答案。

import requests
import re
import pymongo
import time
DATABASE_IP = '127.0.0.1'
DATABASE_PORT = 27017
DATABASE_NAME = 'sun'
client = pymongo.MongoClient(DATABASE_IP,DATABASE_PORT)
db = client.sun
db.authenticate("dba", "dba")
collection = db.zhihuone # 准备插入数据
BASE_URL = "https://www.zhihu.com/question/{}"
def get_totle_answers(article_id):
  headers = {
    "user-agent": "需要自己补全 Mozilla/5.0 (Windows NT 10.0; WOW64)"
  }
  with requests.Session() as s:
    with s.get(BASE_URL.format(article_id),headers=headers,timeout=3) as rep:
      html = rep.text
      pattern =re.compile( '<meta itemProp="answerCount" content="(\d*?)"/>')
      s = pattern.search(html)
      print("查找到{}条数据".format(s.groups()[0]))
      return s.groups()[0]
if __name__ == '__main__':
  # 用死循环判断用户输入的是否是数字
  article_id = ""
  while not article_id.isdigit():
    article_id = input("请输入文章ID:")
  totle = get_totle_answers(article_id)
  if int(totle)>0:
    zhi = ZhihuOne(article_id,totle)
    zhi.run()
  else:
    print("没有任何数据!")

完善图片下载部分,图片下载地址在查阅过程中发现,存在json字段的content中,我们采用简单的正则表达式将他匹配出来。细节如下图展示

Python爬取知乎图片代码实现解析

编写代码吧,下面的代码注释请仔细阅读,中间有一个小BUG,需要手动把pic3修改为pic2这个地方目前原因不明确,可能是我本地网络的原因,还有请在项目根目录先创建一个imgs的文件夹,用来存储图片

def download_img(self,data):
    ## 下载图片
    for item in data["data"]:
      content = item["content"]
      pattern = re.compile('<noscript>(.*?)</noscript>')
      imgs = pattern.findall(content)
      if len(imgs) > 0:
        for img in imgs:
          match = re.search('<img src="(.*?)"', img)
          download = match.groups()[0]
          download = download.replace("pic3", "pic2") # 小BUG,pic3的下载不到
          print("正在下载{}".format(download), end="")
          try:
            with requests.Session() as s:
              with s.get(download) as img_down:
                # 获取文件名称
                file = download[download.rindex("/") + 1:]
                content = img_down.content
                with open("imgs/{}".format(file), "wb+") as f: # 这个地方进行了硬编码
                  f.write(content)

                print("图片下载完成", end="\n")
          except Exception as e:
            print(e.args)
      else:
        pass

运行结果为

Python爬取知乎图片代码实现解析

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python端口扫描简单程序
Nov 10 Python
详解python3中socket套接字的编码问题解决
Jul 01 Python
python 中split 和 strip的实例详解
Jul 12 Python
使用pandas的DataFrame的plot方法绘制图像的实例
May 24 Python
python使用ddt过程中遇到的问题及解决方案【推荐】
Oct 29 Python
使用Python横向合并excel文件的实例
Dec 11 Python
Python3安装psycopy2以及遇到问题解决方法
Jul 03 Python
详解如何减少python内存的消耗
Aug 09 Python
Django2 连接MySQL及model测试实例分析
Dec 10 Python
使用tensorflow DataSet实现高效加载变长文本输入
Jan 20 Python
python opencv检测直线 cv2.HoughLinesP的实现
Jun 18 Python
python四种出行路线规划的实现
Jun 23 Python
Python读写文件模式和文件对象方法实例详解
Sep 17 #Python
Python爬取破解无线网络wifi密码过程解析
Sep 17 #Python
Python使用random模块生成随机数操作实例详解
Sep 17 #Python
python同时替换多个字符串方法示例
Sep 17 #Python
python 函数的缺省参数使用注意事项分析
Sep 17 #Python
Python 字符串、列表、元组的截取与切片操作示例
Sep 17 #Python
Python 实现大整数乘法算法的示例代码
Sep 17 #Python
You might like
php打印一个边长为N的实心和空心菱型的方法
2015/03/02 PHP
用js实现控制内容的向上向下滚动效果
2007/06/26 Javascript
js 页面输出值
2008/11/30 Javascript
用js实现的模拟jquery的animate自定义动画(2.5K)
2010/07/20 Javascript
jQuery.prototype.init选择器构造函数源码思路分析
2013/02/05 Javascript
JQuery中SetTimeOut传参问题探讨
2013/05/10 Javascript
js固定DIV高度,超出部分自动添加滚动条的简单方法
2013/07/10 Javascript
下拉列表select 由左边框移动到右边示例
2013/12/04 Javascript
js中replace的用法总结
2013/12/27 Javascript
js通过更改按钮的显示样式实现按钮的滑动效果
2014/04/23 Javascript
JS截取与分割字符串常用技巧总结
2015/11/10 Javascript
基于Bootstrap使用jQuery实现输入框组input-group的添加与删除
2016/05/03 Javascript
JavaScript必知必会(三) String .的方法来自何方
2016/06/08 Javascript
JavaScript中removeChild 方法开发示例代码
2016/08/15 Javascript
利用jQuery.Validate异步验证用户名是否存在(推荐)
2016/12/09 Javascript
jquery ajaxfileupload异步上传插件使用详解
2017/02/08 Javascript
利用策略模式与装饰模式扩展JavaScript表单验证功能
2017/02/14 Javascript
elemetUi 组件--el-upload实现上传Excel文件的实例
2017/10/27 Javascript
JavaScript 中定义函数用 var foo = function () {} 和 function foo()区别介绍
2018/03/01 Javascript
Angular 数据请求的实现方法
2018/05/07 Javascript
Vue中使用 setTimeout() setInterval()函数的问题
2018/09/13 Javascript
Python高级用法总结
2018/05/26 Python
python中字符串的操作方法大全
2018/06/03 Python
如何用Python合并lmdb文件
2018/07/02 Python
python3实现名片管理系统
2020/11/29 Python
Python Matplotlib 基于networkx画关系网络图
2019/07/10 Python
django页面跳转问题及注意事项
2019/07/18 Python
python实现ftp文件传输系统(案例分析)
2020/03/20 Python
python ETL工具 pyetl
2020/06/07 Python
CSS实现鼠标滑过鼠标点击代码写法
2016/12/26 HTML / CSS
CSS3中线性颜色渐变的一些实现方法
2015/07/14 HTML / CSS
宿舍保安职务说明书
2014/02/25 职场文书
超市促销活动方案
2014/03/05 职场文书
企业口号大全
2014/06/12 职场文书
工作保证书
2015/01/17 职场文书
如何使用SQL Server语句创建表
2022/04/12 SQL Server