Python爬虫面向知乎的答案提取和图片下载
需求描述: 爬取知乎的答案,爬取并下载一个问题下所有回答中的图片。
实现平台: 开发工具PyCharm2017,语言版本Python3.6,Chrome谷歌浏览器。
基本原理: 1.发送请求,获取网页HTML源码;解析HTML,获取数据;保存数据。2
模拟浏览器登录,获取并解析HTML,获取数据。利用Python中的库即可便捷实现。
功能实现1:知乎答案爬取
实现思路:
1. 首先实现安装好第三方模块requests和bs4并调用。
2. 其次设置Http请求头,利用requests访问网页获取到源代码,利用bs模块中的BeautifulSoup得到解析过后的html。
3. 随后,分别通过对照网页源代码中标签内容进行匹配,分别获取问题标题、问题内容、点赞数以及答案等内容。
4. 最后进行包括知乎答案等信息的打印。
分别对应上述思路进行代码编写。
1. 调用第三方模块。
#-*- coding: UTF-8 -*-
# 爬取知乎答案
import requests
from bs4 import BeautifulSoup
2. 设置Http请求头:可以在Chrome谷歌浏览器的网页中的任意地方按下F12,打开chrome自带的调试工具,在调试工具中选择network标签,F5刷新网页后在左边找到该网页url,点击该url,选择Headers,就可以看到当前网页的Http头。复制到header={}中。
获取源代码并解析:利用requests和BeautifulSoup实现,并返回解析后的body。
#获取网页body里的内容
def get_content(url , data = None):
# 设置Http请求头,根据自己电脑查一下
header={
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
"Accept-Encoding": "gzip, deflate, sdch",
"Accept-Language": "zh-CN,zh;q=0.8",
"Connection": "keep-alive",
"User-Agent": "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.235"
}
req = requests.get(url, headers=header)
req.encoding = "utf-8"
bs = BeautifulSoup(req.text, "html.parser") # 创建BeautifulSoup对象
body = bs.body #
return body
3. 标签内容进行class匹配:问题标题——QuestionHeader-title,问题内容——RichText ztext,点赞量——Button VoteButton VoteButton—up,问题回答——ContentItem-time。
#获取问题标题
def get_title(html_text):
data = html_text.find("h1", {"class":" QuestionHeader-title "}) #匹配标签
return data.string.encode("utf-8")
#获取问题内容
def get_question_content(html_text):
data = html_text.find("span", {"class": "RichText ztext"})
print (data.string)
if data.string is None:
out = ""
for datastring in data.strings:
datastring = datastring.encode("utf-8")
out = out + datastring.encode("utf-8")
print ("内容: " + out)
else:
print ("内容: " + data.string.encode("utf-8"))
#获取点赞数
def get_answer_agree(body):
agree = body.find("button",{"class": "Button VoteButton VoteButton--up"})
agree_html = BeautifulSoup(str(agree), "html.parser")
all_buttons = agree_html.find_all("button", {"class": "Button VoteButton VoteButton--up"})
one_button = all_buttons[0]
agree_number = one_button["aria-label"]
print(agree_number)
#获取答案
def get_response(html_text):
out1 = ""
response = html_text.find_all("p", {"class": "ContentItem-time"})
for index in range(len(response)):
#获取标签
answerhref = response[index].find("a", {"target": "_blank"})
if not(answerhref["href"].startswith("javascript")):
url = "http:" + answerhref["href"]
body = get_content(url)
get_answer_agree(body)
answer = body.find("span", {"class": "RichText ztext CopyrightRichText-richText css-hnrfcf"})
if answer.string is None:
out = ""
for datastring in answer.strings:
datastring = datastring.encode("utf-8")
out = out + " " + str(datastring,encoding = "utf-8")
else:
print (answer.string.encode("utf-8"))
out1 = out1 + " " + out
return url + " " + out1
4. 结果输出打印:以一个网址为例,调用之前编写的函数,进行信息的获取和打印。
# 输入要爬取的网址
URL_target = "https://www.zhihu.com/question/505503990/answer/2276487889"
html_text = get_content(URL_target)
title = get_title(html_text)
print ("标题:" + str(title,encoding = "utf-8") + " ")
data = get_response(html_text)
print (data)
功能实现2:知乎图片下载
实现思路:
1. 首先实现安装好chromedriver模拟人为登录浏览器,模拟登录网页,中途拿手机扫码登录。
2. 安装好模块selenium、time、urllib.request 、bs4 和html.parser并调用。
3. 利用chromedriver打开浏览器并登录知乎,利用bs模块中的BeautifulSoup得到解析过后的html。
4. 随后,找到照片并进行下载。
5. 保存所有图片。
思路是先模拟登录网页,(中途拿手机扫码登录),然后逐步爬取所有回答。
1.下载对应Chrome版本的chromedriver。
通过chrome://version/查看版本,下载chromedriver后解压安装。详细可以参考这个说明。
selenium 安装与 chromedriver 安装 :https://www.cnblogs.com/lfri/p/10542797.html
我的Chrome版本是:94.0.4606.71(正式版本)(64 位),对应文件夹应该放在
C:Program FilesGoogleChromeApplication
2.分别对应上述思路进行代码编写,安装好模块并调用。
# 爬取知乎问题下的所有图片
from selenium import webdriver
import time
import urllib.request
from bs4 import BeautifulSoup
import html.parser
3.自动化打开浏览器并扫码登录知乎,并解析网页 HTML 信息,查找所有的noscript标签。
def main():
# 确保文件夹中有chromedriver.exe,有的在C:Program Files x86
chromedriver = "C:Program FilesGoogleChromeApplicationchromedriver.exe"
driver = webdriver.Chrome(chromedriver)
time.sleep(5)
driver.get("https://www.zhihu.com/question/287084175") # 打开想要爬取的知乎页面
time.sleep(5)
# 模拟用户操作
def execute_times(times):
for i in range(times):
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
time.sleep(3)
try:
driver.find_element_by_css_selector("button.QuestionMainAction").click()
print("page" + str(i))
time.sleep(1)
except:
break
# 执行次数
execute_times(5)
# 原网页的信息
result_raw = driver.page_source # 这是原网页 HTML 信息
result_soup = BeautifulSoup(result_raw, "html.parser")# 然后将其解析
result_bf = result_soup.prettify() # 结构化原 HTML 文件
with open("D:/python安装包/PycharmProjects/zhihutupian/raw_result.txt", "w",encoding="utf-8") as raw_result: # 存储路径里的文件夹需要事先创建。
raw_result.write(result_bf)
raw_result.close()
print("爬取回答页面成功!!!")
with open("D:/python安装包/PycharmProjects/zhihutupian/noscript_meta.txt", "wb") 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 + " "
noscript_all = html.parser.unescape(noscript_inner_all).encode("utf-8") # 将内部内容转码并存储
noscript_meta.write(noscript_all)
noscript_meta.close()
print("爬取noscript标签成功!!!")
4.查找所有图片并命名下载。
img_soup = BeautifulSoup(noscript_all, "html.parser")
img_nodes = img_soup.find_all("img")
with open("D:/python安装包/PycharmProjects/zhihutupian/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) + " " + img_url + " "
img_meta.write(line)
urllib.request.urlretrieve(img_url, "D:/python安装包/PycharmProjects/zhihutupian/" + str(count) + ".jpg") # 一个一个下载图片
count += 1
img_meta.close()
print("图片下载成功")
if __name__ == "__main__":
main()
5.最后进行包括知乎图片的保存。
最后,有相关爬虫需求欢迎通过公众号联系我们.
公众号: 320科技工作室
低密度脂蛋白比较高,是什么原因?怎么使它降下来?王医生,我这血脂正常的,怎么还给我开降脂药?患者老孟这样问,质问!老孟是心绞痛的患者,经过王医生调整心率血压抗心绞痛抗血小板聚集稳定斑块等治疗,目前心绞痛不犯了,但是王医生告诉他还
你支持将芯片做成白菜价吗?美国已经愚蠢到了利用自己短暂的科技优势,对我国进行打压的地步了。这说明美国对我国的高科技企业,已经黔驴技穷了。但是,如此短视的科技思维,这不是正在为自己的未来挖坑吗?假如我国将美国
职校学什么专业好?1。适合自己的专业,自己有某方面兴趣爱好和特长,刚好可以运用在专业上的,喜欢美术的选择服装设计计算机类的广告设计等。2。自己喜欢的专业,喜欢和爱好,你才心甘情愿地付出,你的收获也更
山东农业大学与山东师范大学哪个好?您好,很高兴回答你提出的问题,针对于你提出的问题,我将用自己的见解帮你解答。公说公有理,婆说婆有理,关于高校哪一个比较好,特别是差别不是很大的高校,一直以来都是饱受争议。山东农业大
把人的某重要器官取出,人会立刻死亡吗?除了大脑,或许没有任何一个器官取出人会立即死亡。大脑重要的地方不在于产生了意识,而是控制着很多基础的生理功能,没有了大脑心跳呼吸都无法再维持,数分钟内人就死亡。脑是人全身最重要的器
手上有一百万现金,是买银行保本理财好还是大额存单好?100万我既不推荐保本理财,也不推荐大额存单我推荐股份制银行的定期存款。为什么这样?我们对比一下,这三种理财方式的收益和风险比就OK了。第一,我们说理财产品。现在理财产品的刚性兑付
如果一家上市公司的前十大流通股股东中,没有一家机构也没有一家基金,这意味着什么?A股自从经历了2015年的牛市之后,就开始暴跌。跌下来之后市场资金就变少了。人们操作就更加谨慎了。但是,IPO不断在发行,个股数量不断在增加,成交量却在不断萎缩。反映出来就是供过于
面试后让回去等通知,这样还有机会吗?首先,你这个跟之前我的一位读者有点类似张工是一名软件开发人员,主要擅长java开发,两年工作经验。有次,张工去面试,笔试题做了,感觉还不错,要是打分的话,应该在90分以上。对于面试
酒店大堂经理一个月工资是多少钱?首先该问题比较笼统,没有明确区域城市酒店类型等信息,只是泛泛的对这个职位的薪酬问询,所以回答起来很难有针对性,本人就从酒店行业的整体来给您分析解答吧。近年来,国家经济进入转型期,从
试管婴儿和普通婴儿有何区别?我朋友孩子今年大三,但他在小男孩时期就喜欢像大人一样很严肃地和我说话,配上他清秀得像女孩子一样的面孔,特别可爱。他13岁那年夏天,我们一同去西藏旅游,漫长的卧铺车厢颇有些大学卧谈会
你有过把孩子弄丢的经历吗?后来是怎么找到的?谢邀请!我有亲身体会把我女儿弄丢了!那时我女儿才四岁多,跟着我们在外打工,因为我每天买菜做我工人的饭,那时只有自行车骑,不能带她去,市场有十多里,我不知道女儿跟着我在后面追,当我买