说明:
Python版本:Python
IDE:PyCharm
chrome版本:我的版本63
chromedriver.exe:因为是模拟浏览器访问,chrome需要再下载一个驱动,具体方式在我的上一篇博客,内容很详细。传送门:Python网络爬虫(三)chromedriver.exe与chrome版本映射及下载链接:

一、selenium

(1)selenium简介:

为什么用selenium?
前面我们学习了如何爬取一个静态网页,但是,面对有javascript渲染的页面再用前面的方式就不能得心应手。
所以我们选择selenium
什么是selenium?
一句话,自动化测试工具。它支持各种浏览器,包括 Chrome,Safari,Firefox 等主流界面式浏览器,如果你在这些浏览器里面安装一个 Selenium 的插件,那么便可以方便地实现Web界面的测试。换句话说叫 Selenium 支持这些浏览器驱动。Selenium支持多种语言开发,比如 Java,C,Ruby等等,而对于Python,当然也是支持的!

(2)安装selenium:

pip install selenium

二、小试牛刀:

这里,我们以打开百度页面,并控制台输出百度页面源代码,为例。
代码:

from selenium import webdriverif __name__ =='__main__':list_urls=[]url="http://www.baidu.com"options = webdriver.ChromeOptions()options.add_argument('user-agent="Mozilla/5.0 (Linux; Android 4.0.4; Galaxy Nexus Build/IMM76B) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.133 Mobile Safari/535.19",--headless')#options.add_argument('--headless')#options.add_argument('--disable-gpu')driver=webdriver.Chrome(chrome_options=options)driver.get(url)html = driver.page_sourceprint(html)

如图,chrome浏览器自动打开了百度页面,控制台输出了页面源代码。

注意:
(1)注释的两行为使用chrome的headless模式,即不用每次都打开浏览器的窗口,否则,我们做爬虫时,爬取每个网页还跳出窗口,体验太差。自从chrome浏览器提供了headless chrome,相比PhantomJS(更早的一个无头浏览器),获得的数据更优质。但速度可能慢些。
(2) driver.get 方法会打开请求的URL,WebDriver 会等待页面完全加载完成之后才会返回,即程序会等待页面的所有内容加载完成,JS渲染完毕之后才继续往下执行。

所以,我们可以得到JS渲染之后的页面源码。

有了以上的基础,结合BeautifulSoup,我们完全可以作出好玩的事情。

(三)动手实战:爬取妹子图片

1、说在前面:

1.1 URL:http://www.5442.com/tag/rosi.html
1.2 用户代理:

'user-agent="Mozilla/5.0 (Linux; Android 4.0.4; Galaxy Nexus Build/IMM76B) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.133 Mobile Safari/535.19"

我们用到的代理是安卓,事实证明比较好用。但是和你用电脑打开网页,通过审查元素看到的代码是不一样的,所以你分析网页的时候,需要用前面的例子,换掉百度的网址,运行程序,分析页面源码。

2、分析页面:

2.1 我们打开网页发现,每个图片分别放在了class属性为libox的div标签里。

所以,我们会先用BeautifulSoup获取主页面所有,class属性libox的div标签。再将每个标签的href存入list。

 list_urls=[]url="http://www.5442.com/tag/rosi.html"options = webdriver.ChromeOptions()options.add_argument('user-agent="Mozilla/5.0 (Linux; Android 4.0.4; Galaxy Nexus Build/IMM76B) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.133 Mobile Safari/535.19"')options.add_argument('--headless')options.add_argument('--disable-gpu')driver=webdriver.Chrome(chrome_options=options)driver.get(url)html=driver.page_sourcedriver.close()# print(html)bf=BeautifulSoup(html,'lxml')target_urls=bf.find_all(name="div",class_='libox')for each in target_urls:print(each.a.get('href'))list_urls.append(each.a.get('href'))print(len(list_urls))

2.2 选择一张美女图片,我们看到,每个页面中有两张,为了简单起见,我们这里就下载每个页面的两张图片。
通过审查元素,我们可以看到,这两张图片放在了,align属性为center的p标签里。所以我们将用BeautifulSoup获得p标签中所有的src。之后,下载保存图片。

代码:

    for each_img in list_urls:target_url =each_imgoptions = webdriver.ChromeOptions()options.add_argument('user-agent="Mozilla/5.0 (Linux; Android 4.0.4; Galaxy Nexus Build/IMM76B) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.133 Mobile Safari/535.19",')options.add_argument('--headless')options.add_argument('--disable-gpu')pdriver = webdriver.Chrome(chrome_options=options)pdriver.get(target_url)img_html = pdriver.page_sourcepdriver.close()pbf=BeautifulSoup(img_html,'lxml')piurls=pbf.find_all(name='p',align='center')ppbf=BeautifulSoup(str(piurls),'lxml')purls=ppbf.find_all(name='img')if 'images' not in os.listdir():os.makedirs('images')for each in purls:img_url=each.get('src')img_filename='images/'+each.get('alt')+'.jpg'print("正在下载",img_url)urlretrieve(url=img_url,filename=img_filename)

urlretrieve()函数:
urllib 模块提供的 urlretrieve() 函数。urlretrieve() 方法直接将远程数据下载到本地。

urlretrieve(url, filename=None, reporthook=None, data=None)

· 参数 finename 指定了保存本地路径(如果参数未指定,urllib会生成一个临时文件保存数据。)
· 参数 reporthook 是一个回调函数,当连接上服务器、以及相应的数据块传输完毕时会触发该回调,我们可以利用这个回调函数来显示当前的下载进度。
· 参数 data 指 post 到服务器的数据,该方法返回一个包含两个元素的(filename, headers)元组,filename 表示保存到本地的路径,header 表示服务器的响应头。

3、运行程序:

代码我们已经写完了,运行一下,我们查看结果:
想了想,还是处理一下,别被和谐了。

(四)完整代码:

# -*- coding:UTF-8 -*-
'''
单进程
下载妹子图片
'''
from bs4 import BeautifulSoup
from urllib.request import urlretrieve
import os
from selenium import webdriverif __name__ =='__main__':list_urls=[]url="http://www.5442.com/tag/rosi.html"options = webdriver.ChromeOptions()options.add_argument('user-agent="Mozilla/5.0 (Linux; Android 4.0.4; Galaxy Nexus Build/IMM76B) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.133 Mobile Safari/535.19"')options.add_argument('--headless')options.add_argument('--disable-gpu')driver=webdriver.Chrome(chrome_options=options)driver.get(url)html=driver.page_sourcedriver.close()# print(html)bf=BeautifulSoup(html,'lxml')target_urls=bf.find_all(name="div",class_='libox')for each in target_urls:print(each.a.get('href'))list_urls.append(each.a.get('href'))print(len(list_urls))for each_img in list_urls:target_url =each_imgoptions = webdriver.ChromeOptions()options.add_argument('user-agent="Mozilla/5.0 (Linux; Android 4.0.4; Galaxy Nexus Build/IMM76B) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.133 Mobile Safari/535.19",')options.add_argument('--headless')options.add_argument('--disable-gpu')pdriver = webdriver.Chrome(chrome_options=options)pdriver.get(target_url)img_html = pdriver.page_sourcepdriver.close()pbf=BeautifulSoup(img_html,'lxml')piurls=pbf.find_all(name='p',align='center')ppbf=BeautifulSoup(str(piurls),'lxml')purls=ppbf.find_all(name='img')if 'images' not in os.listdir():os.makedirs('images')for each in purls:img_url=each.get('src')img_filename='images/'+each.get('alt')+'.jpg'print("正在下载",img_url)urlretrieve(url=img_url,filename=img_filename)

Python处理javascript页面也有别的方法,但模拟浏览器访问更简单,更友好。这个方案最自然,虽然有人一直在批评这种方法速度比较慢,但在实际运行环境中,大部分情况下你会担心运行的太快了,集中且持续的从同一个网站抓取数据,会给网站造成很大的压力,从而会被封锁或者遇到验证码,所以速度并不是关键问题。

Python网络爬虫(四):selenium+chrome爬取美女图片相关推荐

  1. Python网络爬虫requests、bs4爬取空姐图片,福利哦

    Scrapy框架很好,也提供了很多扩展点,可以自己编写中间件处理Scrapy的Request和Response.但是可定制化或者可掌控性来说,还是自己写的爬虫更加强一些. 接下来,我们来看一下使用Py ...

  2. python网络爬虫实战——利用逆向工程爬取动态网页

    前言 之前写过介绍过网络爬虫的文章,都是一些基础知识,所以在接下来我们完成一个小任务--利用逆向工程爬取一个动态网页,360壁纸网站(https://image.so.com/z?ch=wallpap ...

  3. Python网络爬虫(6)--爬取淘宝模特图片

    经过前面的一些基础学习,我们大致知道了如何爬取并解析一个网页中的信息,这里我们来做一个更有意思的事情,爬取MM图片并保存.网址为https://mm.taobao.com/json/request_t ...

  4. 【Python】爬虫入门6:爬取百度图片搜索结果(基于关键字爬图)

    源代码 #!/usr/bin/env python # -*- coding: UTF-8 -*-# 需求:爬取百度图片# noinspection PyUnresolvedReferences im ...

  5. Python网络爬虫:利用正则表达式爬取豆瓣电影top250排行前10页电影信息

    在学习了几个常用的爬取包方法后,转入爬取实战. 爬取豆瓣电影早已是练习爬取的常用方式了,网上各种代码也已经很多了,我可能现在还在做这个都太土了,不过没事,毕竟我也才刚入门-- 这次我还是利用正则表达式 ...

  6. Python网络爬虫——Appuim+夜神模拟器爬取得到APP课程数据

    一.背景介绍 随着生产力和经济社会的发展,温饱问题基本解决,人们开始追求更高层次的精神文明,开始愿意为知识和内容付费.从2016年开始,内容付费渐渐成为时尚. 罗辑思维创始人罗振宇全力打造" ...

  7. python网络爬虫--项目实战--scrapy爬取人人车(5)

    一.目标 爬取多页人人车的车辆信息 二.分析 2.1 网站分析 在网页源代码中可以搜索到页面中的数据,所以可以判断该页面为静态加载的 三.完整代码 renrenche.py import scrapy ...

  8. Python网络爬虫--项目实战--scrapy爬取人人车

    一.目标 爬取多页人人车的车辆信息 二.分析 2.1 网站分析 在网页源代码中可以搜索到页面中的数据,所以可以判断该页面为静态加载的 三.完整代码 renrenche.py import scrapy ...

  9. Python网络爬虫实战14:爬取酷狗音乐中top500的歌曲

    1.  网页源码 2.  代码实例 # coding:utf-8 # 第一步:导入相关库 import requests # 用于请求网页获取网页数据 from bs4 import Beautifu ...

最新文章

  1. Linux之vim中翻页的命令
  2. 英特尔支持员工自带设备办公
  3. python 模块 wmi 远程连接 windows 获取配置信息
  4. 过分了,这样阅读Datasheet(数据手册)合适吗?
  5. 04数据库的高级查询
  6. ASP.NET MVC 5 学习教程:修改视图和布局页
  7. 孙策被刺杀,凶手是孔雀东南飞里的焦仲卿,主谋是曹操谋士郭嘉
  8. C语言编写双人贪吃蛇游戏
  9. 2021年认证杯-数学建模
  10. matlab画频谱图
  11. 信号发生器的基本知识
  12. Vue实现excel文件下载
  13. conda命令:管理包、管理环境
  14. oracle怎么确定安装成功,怎么判断oracle是否安装成功
  15. 关于 WEB/HTTP 调试利器 Fiddler 的一些技巧分享
  16. 用计算机弹琴琴谱,在电脑上弹钢琴的软件
  17. 笔记本电脑接通网线联网
  18. UVA 10074 Take the Land(最大子矩阵和变形)
  19. 【Week2 -3】Switch日程安排
  20. 高斯日记(c语言习题)

热门文章

  1. c# 自定义类数组实例化与初始化
  2. css实现鼠标移入图片,增加遮罩并在上方显示另一个图片
  3. 基于java房产销售系统计算机毕业设计源码+系统+lw文档+mysql数据库+调试部署
  4. Socket与IO复习
  5. java如何输出一个竖线_关于java:使用竖线字符(“|”)拆分字符串
  6. 跟沐风晓月一起玩转数据库之MySQL数据库表操作技巧与实用方法解析
  7. 水质中的PH值、TDS值、KH值、GH值分别是什么意思
  8. 免费强大文本编辑器, 替代Editplus/UltraEdit收费软件
  9. python培训班送树莓派
  10. kafka原理和性能分析测试