python爬虫知乎图片_python爬虫(爬取知乎答案图片)

python爬虫(爬取知乎答案图片)

1.⾸先,你要在电脑⾥安装 python 的环境

我会提供2.7和3.6两个版本的代码,但是本⽂只以python3.6版本为例。

安装完成后,打开你电脑的终端(Terminal)执⾏以下命令:

搭建 python 3.6环境,

爬虫专用。如果你已经装好了 python3.6的环境,那么可以跳过搭建环境这一步,直接安装所需要的 python库。

检查 python 版本

python –version

2、selenium

因为知乎⽹站前端是⽤ react 搭建的,页⾯内容随着⽤户⿏标滚轴滑动、点击依次展现,为了获取海量的图⽚内容,我们需要⽤selenium这个 lib 模拟⽤户对浏览器进⾏滑动点击等操作。

利⽤ pip 安装 selenium

pip install -U selenium

下载安装完成后,我建议⼤家打开上⾯的链接,阅读⼀下 selenium 的使⽤⽅法。意思⼤致为,为了运⾏ selenium,我们需要安装⼀个 chrome 的driver,下载完成后,对于 Mac ⽤户,直接把它复制到/usr/bin或者/usr/local/bin,当然你也可以⾃定义并添加路径。对于 Win ⽤户,也是同理。

chromedriver与chrome各版本及下载地址

Chrome: 下载地址

Firefox:下载地址

Safari:下载地址

2.0在爬⾍的时候我们经常会发现⽹页都是经过压缩去掉缩进和空格的,页⾯结构会很不清晰,这时候我们就需要⽤ BeautifulSoup 这个 lib 来进⾏html ⽂件结构化。

pip install beautifulsoup4

Section 2 – 代码解释

from selenium import webdriver

import time

import urllib.request

from bs4 import BeautifulSoup

import html.parser

2.1 确定目标URL

在 main 函数里边,打开chrome driver,然后输入 url

def main():

# ********* Open chrome driver and type the website that you want to view ***********************

driver = webdriver.Chrome() # 打开浏览器

列出来你想要下载图片的网站

https://www.zhihu.com/question/35242408   #拥有丰富的表情包是怎样的体验

2.2 模拟滚动点击操作

在 main 函数⾥我们定义⼀个重复执⾏的函数,来进⾏滚动和点击的操作。⾸先我们可以⽤driver.execute_scrip来进⾏滚动操作。通过观察,我们发现知乎问题底部有⼀个“查看更多回答的”的按钮,如下图。因此我们可以⽤driver.find_element_by_css_selector来选中这个按钮,并点击。我们这⾥只爬取五个页⾯的图⽚。其实,五个页⾯,100个回答,往往都能有1000张图⽚了。。。

# ****************** Scroll to the bottom, and click the "view more" button *********

def execute_times(times):

for i in range(times):

driver.execute_script("window.scrollTo(0, document.body.scrollHeight);") # 滑动到浏览器底部

time.sleep(2) # 等待页面加载

try:

driver.find_element_by_css_selector('button.QuestionMainAction').click() # 选中并点击页面底部的加载更多

print("page" + str(i)) # 输出页面页数

time.sleep(1) # 等待页面加载

except:

break

execute_times(5)

2.3 结构化HTML页面并保存

我们每次爬取页⾯信息,要做的第⼀件事就是把页⾯ HTML 存储下来。为了⽅便我们⾁眼浏览,这时候就需要⽤beautifulSoup把压缩后的 HTML ⽂件结构化并保存。

# **************** Prettify the html file and store raw data file *****************************************

result_raw = driver.page_source # 这是原网页 HTML 信息

result_soup = BeautifulSoup(result_raw, 'html.parser')

result_bf = result_soup.prettify() # 结构化原 HTML 文件

with open("./output/rawfile/raw_result.txt", 'w') as girls: # 存储路径里的文件夹需要事先创建。

girls.write(result_bf)

girls.close()

print("Store raw data successfully!!!")

2.4 爬取知乎问题回答里的nodes

要知道,在我们每次想要爬取页⾯信息之前,要做的第⼀件事就是观察,观察这个页⾯的结构,量⾝⽽裁。⼀般每个页⾯⾥都有很多个图⽚,⽐如在这个知乎页⾯⾥,有很多⽤户头像以及插⼊的图⽚。但是我们这⾥不想要⽤户头像,我们只想要要回答问题⾥的照⽚,所以不能够直接爬取所有 <\img> 的照⽚。仔细观察,都是被 escape(HTML entity 转码)了的,所以要⽤html.parser.unescape进⾏解码。

# **************** Find all nodes and store them *****************************************

with open("./output/rawfile/noscript_meta.txt", 'w') as noscript_meta: # 存储路径里的文件夹需要事先创建。

noscript_nodes = result_soup.find_all('noscript') # 找到所有

node

noscript_inner_all = ""

for noscript in noscript_nodes:

noscript_inner = noscript.get_text() # 获取

node内部内容

noscript_inner_all += noscript_inner + "\n"

noscript_all = html.parser.unescape(noscript_inner_all) # 将内部内容转码并存储

noscript_meta.write(noscript_all)

noscript_meta.close()

print("Store noscript meta data successfully!!!")

2.5 下载图片

有了 img 的所有 node,下载图⽚就轻松多了。⽤⼀个 urllib.request.urlretrieve就全部搞定。这⾥我又做了⼀点清理,把所有的 url 单独存了⼀下,并⽤序号标记,你也可以不要这⼀步直接下载。

# **************** Store meta data of imgs *****************************************

img_soup = BeautifulSoup(noscript_all, 'html.parser')

img_nodes = img_soup.find_all('img')

with open("./output/rawfile/img_meta.txt", 'w') as img_meta:

count = 0

for img in img_nodes:

if img.get('src') is not None:

img_url = img.get('src')

line = str(count) + "\t" + img_url + "\n"

img_meta.write(line)

urllib.request.urlretrieve(img_url, "./output/image/" + str(count) + ".jpg") # 一个一个下载图片

count += 1

img_meta.close()

print("Store meta data and images successfully!!!")

记得还有最后的!!!

if __name__ == '__main__':

main()

下面是全部源码

from selenium import webdriver

import time

import urllib.request

from bs4 import BeautifulSoup

import html.parser

def main():

# ********* Open chrome driver and type the website that you want to view ***********************

driver = webdriver.Chrome() # 打开浏览器

# 列出来你想要下载图片的网站

driver.get("https://www.zhihu.com/question/35242408") #拥有丰富的表情包是怎样的体验

# ****************** Scroll to the bottom, and click the "view more" button *********

def execute_times(times):

for i in range(times):

driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")

time.sleep(2)

try:

driver.find_element_by_css_selector('button.QuestionMainAction').click()

print("page" + str(i))

time.sleep(1)

except:

break

execute_times(7)

# **************** Prettify the html file and store raw data file *****************************************

result_raw = driver.page_source # 这是原网页 HTML 信息

result_soup = BeautifulSoup(result_raw, 'html.parser')

result_bf = result_soup.prettify() # 结构化原 HTML 文件

with open("D:/newworld/output/rawfile/raw_result.txt", 'w',encoding='utf-8') as girls: # 存储路径里的文件夹需要事先创建。

girls.write(result_bf)

girls.close()

print("Store raw data successfully!!!")

# **************** Find all nodes and store them *****************************************

with open("D:/newworld/output/rawfile/noscript_meta.txt", 'w',encoding='utf-8') as noscript_meta:

noscript_nodes = result_soup.find_all('noscript') # 找到所有

node

noscript_inner_all = ""

for noscript in noscript_nodes:

noscript_inner = noscript.get_text() # 获取

node内部内容

noscript_inner_all += noscript_inner + "\n"

noscript_all = html.parser.unescape(noscript_inner_all) # 将内部内容转码并存储

noscript_meta.write(noscript_all)

noscript_meta.close()

print("Store noscript meta data successfully!!!")

# **************** Store meta data of imgs *****************************************

img_soup = BeautifulSoup(noscript_all, 'html.parser')

img_nodes = img_soup.find_all('img')

with open("D:/newworld/output/rawfile/img_meta.txt", 'w',encoding='utf-8') as img_meta:

count = 0

for img in img_nodes:

if img.get('src') is not None:

img_url = img.get('src')

line = str(count) + "\t" + img_url + "\n"

img_meta.write(line)

urllib.request.urlretrieve(img_url, "D:/newworld/output/zhihumeinv/" + str(count) + ".jpg") # 一个一个下载图片

count += 1

img_meta.close()

print("Store meta data and images successfully!!!")

if __name__ == '__main__':

main()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/575085.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HTML5简略介绍

今天要说下 HTML5特有的一个元素 canvas &#xff0c;旨在让web页面上作矢量图不需要在依靠flash或是其他插件&#xff0c;在网页上使用canvas元素时&#xff0c;它会创建一块矩形区域&#xff0c;默认300*150&#xff0c;当然也是可以自定义的。Canvas中的坐标是从左上角开始的…

我的世界java和基岩版哪个好玩_我的世界:Java版本好玩还是基岩版好玩?老玩家看完后沉默了...

MC刚开始是在国外风靡了起来&#xff0c;传到中国的时候MC已经火了很久了&#xff0c;这时候外国已经出现了很多玩MC十分厉害的大神和主播&#xff0c;而在国外也有超多的服务器&#xff0c;其中有号称最强的原版生存服务器Scicraft&#xff0c;而在版本方面MC其实算下来大概有…

SQL Server简介

SQL Server是微软的一款关系型数据库。某些平台吹得天花烂坠&#xff0c;今天第一次在自己的项目中使用了下&#xff0c;感觉不是那么好&#xff0c;特别是SQL语句的支持度还是很欠缺&#xff0c;如limit等都不支持&#xff0c;还有特别单双引号都是需要特别注意的,下面是SQL S…

Windows下断言的类型及实现

一、内容综述 本文主要介绍Windows下断言assert的实现&#xff0c;并总结断言的不同应用准则。最后给出一个windows自定义断言的方法。 本文行文参考《Debugging Windows Programs》第三章相关内容&#xff0c;如果有兴趣的话建议读者可以深入阅读下。 二、断言的类型 1. ANSI…

mysql最大执行时间_导入大型MySQL数据库时,最大执行时间超过300秒

我正在尝试使用命令导入641 MBMySQL数据库&#xff1a;mysql -u root -p ddamiane_fakty < domenyin_damian_fakty.sql但是我收到了一个错误&#xff1a;ERROR 1064 (42000) at line 2351406: You have an error in your SQL syntax; check the manual that corresponds to …

linux右上角不显示网络连接_来体验下Linux吧

在前面的几期中我们从树莓派开始了解Linux&#xff0c;大家可能已经想来试一下手了。趁热打铁&#xff0c;本期我将介绍两种方便体验学习Linux的方法&#xff0c;在线体验或者安装虚拟机。1 在线体验Linux如果想快速的体验下Linux系统&#xff0c;我们可以选择云计算服务商提供…

debian下ror新建项目报错解决

一个是缺少mysql的开发包 sudo apt-get install libmysqld-dev 还有一个报错如下 debian ExecJS::RuntimeUnavailable: Could not find a JavaScript runtime. See https://github.com/sstephenson/execjs for a list of available runtimes. 要么自己下载nodejs的包,要么在gem…

mysql中的默认约束_数据库中默认约束的作用

匿名用户1级2016-04-29 回答数据库约束是为了保证数据的完整性而实现的一套机制&#xff0c;它具体的根据各个不同的数据库的实现而有不同的工具。一般来说有以下几种实现方式&#xff1a;1、检查约束&#xff1a;通过在定义数据库表里&#xff0c;在字段级或者是在表级加入的检…

python md5解密_python 生成文件MD5码

pymd5.py的代码如下&#xff1a; #-*-coding:utf-8-*-Created on 2012-5-25 author: kanpiaoxueimport hashlib import os import sys def printUsage(): print (Usage: [python] pymd5.py ) def createMD5(filePath): if not os.path.isfile(filePath): printUsage() else: tm…

Java数据结构、list集合、ArrayList集合、LinkedList集合、Vector集合

数据结构&#xff1a; 数据存储的常用结构有&#xff1a;栈、队列、数组、链表、红黑树。 栈&#xff1a;stack,又称堆栈&#xff0c;它是运算受限的线性表&#xff0c;其限制是仅允许在标的一端进行插入和删除操作&#xff0c;不允许在其他任何位置进行添加、查找、删除等操…

第11章 GUI Page436 使用缓冲DC, wxBufferedPaintDC

所谓“缓冲DC”&#xff0c;是指将所有图元都先划到一个人眼看不到的“设备上下文”之上&#xff0c;最后再一次性复制到真正的屏幕DC之上&#xff0c;这样我们就看不到中间画的过程了&#xff0c;也就不会感到闪烁了。 注意&#xff0c;这时不能解除ScrolledWindow1的背景擦除…

Tomcat+JSP经典配置实例

经常看到jsp的初学者问tomcat下如何配置jsp、servlet和bean的问题&#xff0c;于是总结了一下如何tomcat下配置jsp、servlet和ben&#xff0c;希望对那些初学者有所帮助。    一、开发环境配置    第一步&#xff1a;下载j2sdk和tomcat&#xff1a;到sun官方站&#xf…

python海龟编辑器画小汽车_【海龟编辑器下载】海龟编辑器(Python编辑器) v1.3.4 官方免费版-趣致软件园...

海龟编辑器是一款专为广大少儿打造的Python编辑器&#xff0c;该软件功能强大且使用便利&#xff0c;可以帮助孩子们以搭积木的方式来学习Python&#xff0c;并且支持Python代码和图形化积木的双向互相转译&#xff0c;不但可以有效提升孩子的学习兴趣&#xff0c;而且还能够降…

.net 页面之间传值的几种方法!(转)

QueryString传值&#xff1a;1. 这是最简单的传值方式&#xff0c;但缺点是传的值会显示在浏览器的地址栏中且不能传递对象&#xff0c;只适用于传递简单的且安全性要求不高的整数值&#xff0c;例如&#xff1a; 2. 新建一个WEB项目&#xff0c;添加一个页面命名为Test1&#…

微信小程序中组件的使用

微信小程序中组件的使用&#xff1a; 微信小程序中组件定义在项目根目录下components文件夹下&#xff0c;在页面使用的时候需要在页面的json文件中声明&#xff0c;如 父组件向子组件传值及子组件向父组件传值&#xff1a; 父组件wxml中&#xff1a;通过属性绑定值的方式向…

mysql允许所有用户连接_Mysql权限控制 - 允许用户远程连接

Mysql为了安全性&#xff0c;在默认情况下用户只允许在本地登录&#xff0c;可是在有此情况下&#xff0c;还是需要使用用户进行远程连接&#xff0c;因此为了使其可以远程需要进行如下操作&#xff1a;一、允许root用户在任何地方进行远程登录&#xff0c;并具有所有库任何操作…

mysql id 不在集合里面_MySQL,PHP:从表中选择*,其中id不在数组中

所以我现在有一个数据库表&#xff0c;我试图选择所有记录&#xff0c;除了包含在我所做的数组中的所有记录。正如一些背景方面&#xff1a;MySQL&#xff0c;PHP&#xff1a;从表中选择*&#xff0c;其中id不在数组中在有问题的数据库表的结构是&#xff1a;server_status:id …

#并行优化# 容错算法 (Fault Tolerant)

容错算法 (Fault Tolerant) 容错算法 (Fault Tolerant) 转载于:https://www.cnblogs.com/daijkstra/p/4105305.html

python人工智能pdf_800G人工智能学习资料:AI电子书+Python语言入门+教程+机器学习等限时免费领取!...

人工智能的热潮在今年再创高峰。无论是政策上还是资本市场上&#xff0c;抑或是我们日常生活中&#xff0c;关于人工智能的消息从未间断&#xff0c;逐渐占据我们每个人的视线。可以看出&#xff0c;人工智能得到了由上至下&#xff0c;国内国外的一致支持。 基于这股热潮&…

mysql rpm 安装多实例_MySQL多实例安装

MySQL多实例安装1、配置3306实例1.1、查询服务器上是否已经安装的mysql[rootmasterMySQL-5.6.25-1.el6.x86_64.rpm-bundle]# rpm -aq | grep mysqlmysql-server-5.1.66-2.el6_3.x86_64mysql-libs-5.1.66-2.el6_3.x86_64mysql-devel-5.1.66-2.el6_3.x86_64qt-mysql-4.6.2-25.el6…