Python 官方文档:入门教程 => 点击学习
目标网站:需要爬取的网站:http://jandan.net/ooxx 目标分析:先找到总页数,即可以利用selenium的模拟点击到下一个页面找到每个图片的地址:右键检查图片的代码,找到图片的代码爬虫代码:创建一个getJianDan.p
目标网站:
需要爬取的网站:http://jandan.net/ooxx
目标分析:
先找到总页数,即可以利用selenium的模拟点击到下一个页面
找到每个图片的地址:
右键检查图片的代码,找到图片的代码
爬虫代码:
创建一个getJianDan.py文件,代码如下:
#!/usr/bin/env python
# coding: utf-8
from selenium import WEBdriver
from mylog import MyLog as mylog
import JSON
import os
import urllib.request
import time
class GetJianDan(object):
"""the all data from jandan.net
所有数据来自煎蛋网
"""
def __init__(self):
self.startUrl = 'Http://jandan.net/ooxx'
self.log = mylog()
self.browser = self.getBrowser()
self.getPageNext(self.browser)
def getBrowser(self):
try:
# 方法一: 指定Phantomjs的路径
#browser = webdriver.PhantomJS(executable_path=r"D:\phantomjs-2.1.1-windows\bin\phantomjs.exe")
# 方法二: 复制PhantomJS.exe到C:\python35目录下(Python安装目录下)
browser = webdriver.PhantomJS()
browser.get(self.startUrl) # 打开目标网站
browser.implicitly_wait(20) # 等待js代码加载完毕
except Exception as e:
self.log.error('open the %s failed:%s' % (self.startUrl, e))
else:
return browser
def saveImg(self, browser):
# 找到所有图片的标签,返回一个list
elements = browser.find_elements_by_xpath('//ol[@class="commentlist"]//div[@class="row"]\
//div[@class="text"]')
for element in elements:
src = element.find_element_by_xpath("./p//img").get_attribute('src') # img 下载地址
imgName = element.find_element_by_xpath("./span/a").text # img 名字
suffix_name = os.path.splitext(src)[1] # img后缀名
# 判断图片后缀是否为.gif,如果是则获取org_src属性
if suffix_name == '.gif':
# 重新赋值给src,这样爬取的才是动态的gif图片
src = element.find_element_by_xpath("./p//img").get_attribute('org_src')
full_name_img = imgName + suffix_name # img完整名字
try:
# 下载图片,需要传入(图片下载地址,img完整名字带后缀名)
urllib.request.urlretrieve(src, full_name_img)
time.sleep(1) # 设置下载延迟,防止被封
except Exception as e:
self.log.error('%s download failed, %s' % (full_name_img, e))
else:
self.log.info('%s download success' % full_name_img)
def createDir(self, dirName):
"""创建目录"""
if os.path.exists(dirName):
self.log.error('create directory %s failed, have a sane name file or directory' % dirName)
else:
try:
os.makedirs(dirName)
except Exception as e:
self.log.error('create directory %s failed : %s' % (dirName, e))
else:
self.log.info('create directory %s success' % dirName)
def getPageNext(self, browser):
# 获取总页数
sumPage = json.loads(browser.find_element_by_xpath("//div[@class='comments']/\
div[@class='cp-pagenavi']/span[last()]").text)
cartoonTitle = browser.title # 获取目录名
self.createDir(cartoonTitle) # 创建存储图片目录
os.chdir(cartoonTitle) # 进入创建的目录
i = 1
while i <= sumPage[0]:
self.saveImg(self.browser)
i += 1
self.log.info('开始爬取第%d页' % i)
# 利用selenium点击下一页,获取下一页的内容
NextTag = browser.find_element_by_partial_link_text("下一页").click()
browser.implicitly_wait(30) # 等待加载js代码
time.sleep(3)
self.log.info('save img success')
browser.quit()
if __name__ == '__main__':
st = GetJianDan()
mylog.py日志文件代码如下:
#!/usr/bin/env python
# coding: utf-8
import logging
import getpass
import sys
# 定义MyLog类
class MyLog(object):
def __init__(self):
self.user = getpass.getuser() # 获取用户
self.logger = logging.getLogger(self.user)
self.logger.setLevel(logging.DEBUG)
# 日志文件名
self.logfile = sys.argv[0][0:-3] + '.log' # 动态获取调用文件的名字
self.fORMatter = logging.Formatter('%(asctime)-12s %(levelname)-8s %(message)-12s\r\n')
# 日志显示到屏幕上并输出到日志文件内
self.logHand = logging.FileHandler(self.logfile, encoding='utf-8')
self.logHand.setFormatter(self.formatter)
self.logHand.setLevel(logging.DEBUG)
self.logHandSt = logging.StreamHandler()
self.logHandSt.setFormatter(self.formatter)
self.logHandSt.setLevel(logging.DEBUG)
self.logger.addHandler(self.logHand)
self.logger.addHandler(self.logHandSt)
# 日志的5个级别对应以下的5个函数
def debug(self, msg):
self.logger.debug(msg)
def info(self, msg):
self.logger.info(msg)
def warn(self, msg):
self.logger.warn(msg)
def error(self, msg):
self.logger.error(msg)
def critical(self, msg):
self.logger.critical(msg)
if __name__ == '__main__':
mylog = MyLog()
mylog.debug(u"I'm debug 中文测试")
mylog.info(u"I'm info 中文测试")
mylog.warn(u"I'm warn 中文测试")
mylog.error(u"I'm error 中文测试")
mylog.critical(u"I'm critical 中文测试")
运行主程序getJianDan.py
Pycharm运行结果
下载图片截图:
代码分析:
mylog.py 日志模块,记录一些爬取过程中的信息,在大量爬取的时候,没有log帮助定位,很难找到错误点
主程序:
getJianDan.py 主程序
getBrowser 打开目标网站,并返回内容
saveImg 处理每个页面img,并下载
createDir 创建图片保存目录
getPageNext 模拟用户点击下一页行为,发起新的请求
--结束END--
本文标题: Seleninum&PhamtomJS爬取煎蛋网妹子图
本文链接: https://lsjlt.com/news/179166.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
2024-03-01
2024-03-01
2024-03-01
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0