selenium+python 爬取网络图片(2) -- 百度

上一篇博文介绍了如何用selenium+python在诸如soso、谷歌、好搜等搜索引擎上爬取图片的方法,但是却没用提到百度,因为百度的情况比较特殊。首先,百度图片的数据更好,因为每幅图片都有“data-desc”描述可以作为图像很好的语义标签,此外基于百度较强的技术其查询搜索得到的图片相关性较高,后续人工筛选工作较少;其次,百度图片的数据不容易爬取,如果像前一篇文章中的方法取img标签的src值作为下载url,是下载不到图片的,得到的知识167B的非图像数据。

那么,如何爬取百度图片呢,笔者尝试了两种方法。第一种方法尚未完整实现,但思路已完整,第二种方法可以较为简单的爬到百度图片数据源。下面依次介绍两种实现方案。

方案1:

使用selenium模拟鼠标操作--“将鼠标放置图像上方,右键并选择图像另存为选项”,然后就可以保存了,代码如下:

from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.keys import Keys

# init
url = 'http://image.baidu.com/i?tn=baiduimage&ipn=r&ct=201326592&cl=2&lm=-1&st=-1&fm=index&fr=&sf=1&fmq=&pv=&ic=0&nc=1&z=&se=1&showtab=0&fb=0&width=&height=&face=0&istype=2&ie=utf-8&word=%E6%89%8B%E6%9C%BA&oq=shouji&rsp=1'
xpath = '//ul/li/div/a/img'

# set profile
fp = webdriver.FirefoxProfile()
fp.set_preference('browser.download.folderList', 2)
fp.set_preference('browser.download.manager.showWhenStarting', False)
fp.set_preference('browser.download.dir', './yourfolder/')
fp.set_preference('browser.helperApps.neverAsk.saveToDisk', 'image/jpeg')

# launch driver
driver = webdriver.Firefox(firefox_profile=fp)
driver.maximize_window()
driver.get(url)

for element in driver.find_elements_by_xpath(xpath):
    img_url = element.get_attribute('src')
    img_desc = element.get_attribute('data-desc')

    action = ActionChains(driver).move_to_element(element)
    action.context_click(element)
    action.send_keys(Keys.ARROW_DOWN)
    action.send_keys('v')
    action.perform()
    # click save image

driver.close()

但是,想必大家都会发现,保存图片还需要一次次点击对话框的确认保存,很繁琐。的确,为了解决这个问题,我google了好久并没有找到直接解决的好方法,根本原因是selenium无法操作操作系统级的对话框,有说上面“set profile”代码段的设置能解决问题的并不靠谱。所以,如果采用右键另存为的方案的话,需要额外使用插件或钩子程序模拟自动点击。网上有推荐一个AutoIT的或可完成任务,未亲试。

方案2:

百度图片img标签内含的src并不能下载到原图片,只有data-desc属性可用,但是,当鼠标放在百度图片上时,会发现如下图所示的下载按钮,

只要找到这个上面这个下载按钮对应的链接即可下载到原图,而按钮对应的则是一个a链接标签,分析出其xpath问题即解决了,下面给出python代码:

import urllib
import time
from selenium import webdriver

class Crawler:

    def __init__(self):
        self.url = 'http://image.baidu.com/i?tn=baiduimage&ipn=r&ct=201326592&cl=2&lm=-1&st=-1&fm=index&fr=&sf=1&fmq=&pv=&ic=0&nc=1&z=&se=1&showtab=0&fb=0&width=&height=&face=0&istype=2&ie=utf-8&word=%E6%89%8B%E6%9C%BA&oq=shouji&rsp=1' # url to crawl
        self.img_xpath = '//ul/li/div/a/img' # xpath of img element
        self.download_xpath = '//ul/li/div/div/span/a[@class="downloadicon"]' # xpath of download link element
        self.img_url_dic = {}

    # kernel function
    def launch(self):
        # launch driver
        driver = webdriver.Firefox()
        driver.maximize_window()
        driver.get(self.url)

        img_xpath = self.img_xpath
        download_xpath = self.download_xpath
        img_url_dic = self.img_url_dic

        # 模拟滚动窗口以浏览下载更多图片
        pos = 0
        for i in range(10):
            pos += i*500 # 每次下滚500
            js = "document.documentElement.scrollTop=%d" % pos
            driver.execute_script(js)
            # get image desc and download
            for img_element, link_element in zip(driver.find_elements_by_xpath(img_xpath), driver.find_elements_by_xpath(download_xpath)):
                img_desc = img_element.get_attribute('data-desc') # description of image
                img_desc = self.filter_filename_str(img_desc)

                img_url = link_element.get_attribute('href') # url of source image
                if img_url != None and not img_url_dic.has_key(img_url):
                    img_url_dic[img_url] = ''
                    ext = img_url.split('.')[-1]
                    filename = img_desc + '.' + ext
                    print img_desc, img_url
                    urllib.urlretrieve(img_url, './yourfolder/%s' % filename)
                    time.sleep(1)
        driver.close()

    # filter invalid characters in filename
    def filter_filename_str(self, s):
        invalid_set = ('\\','/',':','*','?','"','<','>','|',' ')
        for i in invalid_set:
            s = s.replace(i, '_')
        return s    

if __name__ == '__main__':
    crawler = Crawler()
    crawler.launch()

爬取后的结果图如下所示:

以上代码仅示例的实现了方案,验证其可行性,内部可能含有部分疏漏,仅供需要的朋友参考,不妥之处请指正。

时间: 2024-11-09 01:25:13

selenium+python 爬取网络图片(2) -- 百度的相关文章

selenium+python 爬取网络图片(1) -- soso、谷歌、好搜

做图像处理的朋友,都时常需要收集整理大量的图像数据集.做科研时有各种现有的标准数据集大家都直接拿来用,但是工程上却经常需要自己收集图片,从网上爬取图片便成了比较常见的任务.为了用python完成这个任务,需要解决如下两个问题: 1. 图片素材源自哪里呢?第一直觉就是搜索引擎里的图片,比如要收集手机的图片,则进入搜索引擎搜索关键字即可得到大量相关图片. 2. 动态网站的内容往往是通过ajax异步加载,直接用python中urllib库read到的内容不完整,且需要的内容基本都是异步加载进来的,直接

selenium+python爬取数据跳转网页

项目要做一个四个层级栏的数据抓取,而且点击查询后数据会在新跳出的网页. 源码如下 注释解释 from selenium import webdriver import selenium #from time import sleep as sp url='http://202.127.42.157/moazzys/nongqing.aspx' site=webdriver.Chrome() site.get(url) #data={} mainhandle=site.current_window

[python爬虫] Selenium定向爬取虎扑篮球海量精美图片

前言: 作为一名从小就看篮球的球迷,会经常逛虎扑篮球及湿乎乎等论坛,在论坛里面会存在很多精美图片,包括NBA球队.CBA明星.花边新闻.球鞋美女等等,如果一张张右键另存为的话真是手都点疼了.作为程序员还是写个程序来进行吧!        所以我通过Python+Selenium+正则表达式+urllib2进行海量图片爬取.        前面讲过太多Python爬虫相关的文章了,如爬取新浪博客.维基百科Infobox.百度百科.游迅网图片,也包括Selenium安装过程等等,详见我的两个专栏: 

python爬取某个网页的图片-如百度贴吧

python爬取某个网页的图片-如百度贴吧 作者:vpoet 日期:大约在冬季 注:随意copy,不用告诉我 #coding:utf-8 import urllib import urllib2 import re if __name__ =="__main__": rex=r'src="(http://imgsrc.baidu.com/forum/w%3D580.*?\.jpg)"'; Response=urllib2.urlopen("http://t

[python爬虫] Selenium定向爬取PubMed生物医学摘要信息

本文主要是自己的在线代码笔记.在生物医学本体Ontology构建过程中,我使用Selenium定向爬取生物医学PubMed数据库的内容.        PubMed是一个免费的搜寻引擎,提供生物医学方面的论文搜寻以及摘要.它的数据库来源为MEDLINE(生物医学数据库),其核心主题为医学,但亦包括其他与医学相关的领域,像是护理学或者其他健康学科.它同时也提供对于相关生物医学资讯上相当全面的支援,像是生化学与细胞生物学.        PubMed是因特网上使用最广泛的免费MEDLINE,该搜寻引

python爬取百度翻译返回:{&#39;error&#39;: 997, &#39;from&#39;: &#39;zh&#39;, &#39;to&#39;: &#39;en&#39;, &#39;query 问题

解决办法: 修改url为手机版的地址:http://fanyi.baidu.com/basetrans User-Agent也用手机版的 测试代码: # -*- coding: utf-8 -*- """ ------------------------------------------------- File Name: requestsGet Description : 爬取在线翻译数据s Author : 神秘藏宝室 date: 2018-04-17 --------

通过python 爬取网址url 自动提交百度

通过python 爬取网址url 自动提交百度 昨天同事说,可以手动提交百度这样索引量会上去. 然后想了下.是不是应该弄一个py 然后自动提交呢?想了下.还是弄一个把 python 代码如下: import os import re import shutil REJECT_FILETYPE = 'rar,7z,css,js,jpg,jpeg,gif,bmp,png,swf,exe' #定义爬虫过程中不下载的文件类型 def getinfo(webaddress): #'#通过用户输入的网址连接

没有内涵段子可以刷了,利用Python爬取段友之家贴吧图片和小视频(含源码)

由于最新的视频整顿风波,内涵段子APP被迫关闭,广大段友无家可归,但是最近发现了一个"段友"的app,版本更新也挺快,正在号召广大段友回家,如下图,有兴趣的可以下载看看(ps:我不是打广告的,没收广告费的) 同时,之前同事也发了一个贴吧的段子聚居地,客官稍等,马上奉上连接:段友之家?https://tieba.baidu.com/f?ie=... 然后呢,看到上面,确实好多段友在上面,于是乎,我就想爬取他们的图片和小视频,就有了这篇文章的主题: 其实吧,用Python爬取网站数据是最基

分手后,小伙怒用Python爬取上万空姐照片,赢取校花选举大赛!

首先展示下Python爬取到的成果:   我做什么都要争第一,这次的校花投票选举大赛也不例外,虽然我是个男的......但是我看到了前女友竟然已经有三百多票排到第三名了,我怎么能眼睁睁的看着她优秀呢?我必须要让她排到前三除外,·不行,必须是前十开外!我想到一个办法就是用Python开发一个百度爬虫,爬取百度所有美女的照片,然后申请多个账号进行参赛.   其实比起Python爬取图片外,我对微信上的投票小程序也有所研究,已经有了Python实现微信上刷票脚本的思路,这个我下次再分享大家,这次先学习