动态网页抓取(爬取一个图片网站花瓣网,写一个比较简单的爬虫)
优采云 发布时间: 2021-12-05 14:12动态网页抓取(爬取一个图片网站花瓣网,写一个比较简单的爬虫)
今天我们要爬取一张图片网站花瓣网,写一个比较简单的图片下载爬虫;
迪列巴
图片太多了,我只剪了这些,大概几千张;
对,没错,就是你喜欢的胖迪,
1、 先分析一下花瓣网图片的加载方式
打开花瓣网首页,搜索“迪丽热巴”,
第一页加载20张图片
弹出登录框时下拉加载第二页图片,只有登录账号才能继续加载后续所有图片;
第二页加载了20张图片
可以看出的图片加载是异步的。这时候我们可以选择selenium来模拟登录网页,模仿浏览器的操作不断下拉加载所有图片;
2、主要思想:
首先,登录您的帐户并输入您要搜索的图片。每次下拉加载当前页面的图片后,提取图片的url并保存在列表中。由于每页有20张图片,我也在这里下载图片。每保存20个url就下载对应的20张图片;
3、准备:
安装selenium库,pip或者下载到本地安装都可以;
下面是安装Phantomjs或者Chrome
chromedriver的安装路径
phantomjs安装路径
可以自己百度下载,也可以参考下面的博客,谢谢这位博主
Windows下安装PIP+Phantomjs+Selenium
4、 直接上传下面的代码
<p>from selenium import webdriver
import time
import os
import requests
class Huaban():
#获取图片url并存到列表urls_list
def get_picture_url(self, content):
global path
path = "E:\spider\pictures\huaban" + '\\' + content
# 保存图片到磁盘文件夹 file_path中,默认为当前脚本运行目录下的文件夹
if not os.path.exists(path):
os.makedirs(path)
url = "http://huaban.com"
# 使用Chrome浏览器模拟打开网页,但是要把下载的chromedriver.exe放在python的文件路径下,
# 调试好之后换成PhantomJs,速度应该会快一点
# driver = webdriver.PhantomJs()
# 下拉滑动浏览器屏幕,具体下拉多少根据自己实际情况决定
driver = webdriver.PhantomJS()
#driver = webdriver.Chrome()
# 设置全屏
driver.maximize_window()
driver.get(url)
time.sleep(8)
# 点击登录、呼起登录窗口
driver.find_elements_by_xpath('//a[@class="login btn wbtn"]')[0].click()
# sign in the username
try:
driver.find_elements_by_xpath('//input[@name="email"]')[0].send_keys('花瓣账号')
print('user success!')
except:
print('user error!')
time.sleep(3)
# sign in the pasword
try:
driver.find_elements_by_xpath('//input[@name="password"]')[0].send_keys('账号密码')
print('pw success!')
except:
print('pw error!')
time.sleep(3)
# click to login
try:
driver.find_elements_by_xpath('//a[@class="btn btn18 rbtn"]')[0].click()
print('click success!')
except:
print('click error!')
time.sleep(3)
#搜索图片
driver.find_elements_by_xpath('//input[@placeholder="搜索你喜欢的"]')[0].send_keys(content)
driver.find_elements_by_xpath('//form[@id="search_form"]/a')[0].click()
time.sleep(5)
i = 0
page = 1
global name
global store_path
global urls_list
urls_list = []
#获取图片的总数
pictures_count = driver.find_elements_by_xpath('//a[@class="selected"]/i')[0].text
print(pictures_count)
pages = int(int(pictures_count) / 20)
print(pages)
#匹配到图片url所在的元素
url_elements = driver.find_elements_by_xpath('//span[@class="stop"]/../img')
#遍历图片元素的列表获取图片的url
for url_element in url_elements:
picture_url = url_element.get_attribute("src")[:-3] + "658"
#防止获取重复的图片url
if picture_url not in urls_list:
urls_list.append(picture_url)
while page