Python + Selenium:自动翻页爬取某图片网站指定图集

简单来说,爬取工作前期任务是了解目标网站的体系结构和“反爬策略”,然后是根据现有软硬件资源环境条件设计代码,反复迭代测试,最终实施部署。

之前,写过爬取图片网站的PHP和Python代码spi之类,通过读取HTML文本内容,模糊检索HTML img标签获取资源。批量爬取效率较高,但是只能应对“宽松”的爬虫应对策略,须应对各种不同文本编码和网站管理员的“疏忽”造成的编码混乱问题,且受网路网络实时状况影响较大,出现不稳定的现象。今昨心血来潮,改进原来的思路,采用Python + Selenium + 自定义HTML DOM解释器1(正则表达式RE)来实现。效率不如检索纯HTML文本高,但是准确率、稳定性较高。

先开展前期准备工作,深入了解目标体系结构。

任意点开一个目标图集网页:

Python + Selenium:自动翻页爬取某图片网站指定图集_第1张图片

可以看到图集的标题、更新时间、栏目以及翻页方式等等详细信息。由于需要自动翻页,获取图片页数的边界很重要。刚好,图集的页数总量在标题中。这样,只需获取该HTML节点的HTML文本(innerHTML),加以正则表达式就可以识别。完美解决翻页次数的问题。而翻页,如“温馨提示”所说 – “点击图片”即可。Selenium具有鼠标点击HTML节点操作的事件。

# 标题内容包含页码信息
pagePattern='([0-9]+[/][0-9]+)'
# 匹配标题HTML的页码
matches=re.findall(pagePattern, html)
# 目标只有一个
counts=matches[0]

现在通过浏览器来查看目标的HTML结构。博主使用的是Chrome浏览器(Firefox/Internet等Selenium支持的都可以)。右击目标图片检查:

Python + Selenium:自动翻页爬取某图片网站指定图集_第2张图片

从图片看出,目标图片被包含在一个超链接,超链接被包含在一个div标签。目标的体系结构相对较简单。在网页加载进来,目标标签渲染完成后,定位该标签节点,获取其HTML文本内容,加以分析得出目标图片的地址。保存目标后,操作点击事件实现自动翻页,进行下一次处理分析,直到到达上述翻页界限。自动翻页结束后,开始下载上述步骤获取的目标图片集。

实现过程明确,开始实现设计代码。

# -*- coding: utf-8 -*-
#!/usr/bin/env python

"""
@author: WowlNAN

@github: https://github.com/WowlNAN

@blog: https://blog.csdn.net/qq_21264377

"""
"""
Get target pictures of specific website
"""

import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as ECS
from htmldom import *
import re
import sys
from schedule import *

class Solution:
        def __init__(self):
            self.url=''
            self.driver=webdriver.Chrome()
            self.images={
   }
            self.path=None
            
        def __delete__(self):
            self.url=None
            self.images=None
            self.path=''
            if self.driver:
                self.driver.close()
                self.driver=None
                
        def reset(self):
            self.url=''
            self.images={
   }
            self.path=None
            
        def dictimage(self, index: int, url: str):
            if self.images.get(index, '')=='':
                self.images[index]=url
                
        def pickimage(self, index: int, html: str):
            imagehtmls=match('//a//img', html)
            image=re.findall('src="([^<>"]*)"', imagehtmls[0])[0]
            self.dictimage(index, image)
            return image
            
        def getimages(self, url: str):
            if not url:
                return None
            elif not url.strip():
                return None
            elif not url.startswith('http://') and not url.startswith('https://'):
                return None
            self.path=url.split

你可能感兴趣的:(Python,Notes,爬虫,python,selenium,html,dom)