主要思路:
利用Chrome的selenium登录url,使用鼠标滚动,明确显示回复内容中的图片显示出来。抓取图片地址。
import requests
from lxml import etree
from selenium import webdriver
import time
class Spider(object):
def __init__(self):
self.headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.125 Safari/537.36"
}
self.driver = webdriver.Chrome()
# 下载保存图片
def request_pic(self, name, url):
response = requests.get(url, headers=self.headers)
with open('{}.jpg'.format(name), 'wb') as f:
f.write(response.content)
# 登录url获取图片地址
def run(self, url):
self.driver.get(url)
time.sleep(3)
# 根据xpath路径得到所有图片标签
figure_list = self.driver.find_elements_by_xpath(r"//span[@class='RichText ztext CopyrightRichText-richText']")
# 设置滚动指定高度初始值
js_num = 2000
for i in range(1, 500):
# 设置js语句(向下滚动2000高度)
js = "var q=document.documentElement.scrollTop={}".format(js_num)
self.driver.execute_script(js)
# 获取标签内src值=图片地址
pic_url = figure_list[0].find_element_by_xpath(r"./figure[{}]/img".format(i)).get_attribute("src")
time.sleep(3)
print(pic_url)
# 下次滚动高度
js_num += 2000
self.request_pic(i, pic_url)
url = "https://www.zhihu.com/question/373960489/answer/1032475670"
myspider = Spider()
myspider.run(url)