看到csdn公众号上推送的一篇利用selenium+PhantomJs爬取煎蛋妹子图的文章,对于初学爬虫的我跃跃欲试。
selenium是自动化测试的工作,Phantomjs相当于无界面的浏览器,用的内核是webkit,很遗憾的是当我配置完环境之后,调试时,蹦出来一个警告,大致意思selenium不支持Phantomjs,请使用headless的chrome和firefox。后来又查了下,说是selenium3.4版本以后不支持Phantomjs.而我的selenium版本是3.11。
既然提示使用headless的chrome和firefox,我就又去搜索了一下,下载了chromedriver。headless模式就是加一个参数
option
=
webdriver.ChromeOptions()
option.add_argument(
'headless'
)
结果呢,一直提示gpu的问题,通过搜索大佬的文章,得知option必须增加一个参数:
options.add_argument("--disable-gpu")
添加参数之后,倒是可以运行,但是速度奇慢无比,而且遇到稍微复杂的网站,一直会出现超时,根本无法获取页面源文件。
不知道是不是chrome浏览器版本与驱动版本,又或者是和selenium版本的兼容性差?
我果断尝试了firefox的headless模式,结果发现相当好用。
---------------这里是爬取妹子图的分割线----------------
环境如下:
python3.6
selenium3.11
firefox 59.0.2
下载妹子图,首先要分析妹子图的下载链接,打开http://jandan.net/ooxx 煎蛋妹子图首页,在图片上右键查看元素

图片定位到<img src>这行,没错这是图片的地址,但仔细看看会发现每张图片的左上角会有一个‘查看原图’的灰色字体,点开来是高清原图,再看<img src>的上面一行也有一个链接,在href里面,后面的text正是查看原图,复制到浏览器中正是原图的链接。
想要爬取图片,只要先获取这些图片的地址,然后下载下来就可以了,首先获取页面源码。
from
bs4
import
BeautifulSoup
from
selenium
import
webdriver
from
lxml
import
etree
option
=
webdriver.FirefoxOptions()
option.set_headless()
driver
=
webdriver.Firefox(
firefox_options
=
option)
driver.get(
'http://jandan.net/ooxx'
)
source
=
driver.page_source
获取到页面源码之后,将源码进行解析。之前我一直用BeautifulSoup来提取数据
btu
=
BeautifulSoup(source,
'html.parser'
)
imglist
=
btu.find_all(
class_
=
'view_img_link'
)
for
img
in
imglist:
print
(img.get(
'href'
))
后来发现利用lxml的etree速度更快,提取结果是一致的
content
=
etree.HTML(source)
imglist
=
content.xpath(
'//div[@class="text"]/p/a/@href'
)
唯一不一样的是用xpath直接提取href的链接,不用再像BeautifulSoup中先定位到class,再get(‘href’)
执行结果:

完整代码如下:
from
selenium
import
webdriver
from
lxml
import
etree
import
requests
import
time
import
random
class
download_img
(
object
):
def
__init__
(
self
):
self
.url
=
'http://jandan.net/ooxx'
option
=
webdriver.FirefoxOptions()
option.set_headless()
self
.driver
=
webdriver.Firefox(
firefox_options
=
option)
def
pageurl
(
self
):
page_url
=
[]
for
i
in
range
(
10
,
12
):
url
=
'http://jandan.net/ooxx/page-
%d
#comments'
%
i
page_url.append(url)
print
(url)
return
page_url
def
imgurl
(
self
,
url
):
self
.driver.get(url)
time.sleep(
5
)
source
=
self
.driver.page_source
self
.driver.quit()
content
=
etree.HTML(source)
imglist
=
content.xpath(
'//div[@class="text"]/p/a[@class="view_img_link"]/@href'
)
for
i
in
range
(
len
(imglist)):
imglist[i]
=
'http:'
+
imglist[i]
return
imglist
def
downloder
(
self
,
url
):
i
=
1
for
each
in
url:
time.sleep(random.randint(
1
,
10
))
name
=
each.split(
'/'
)[
-
1
]
content
=
requests.get(each).content
with
open
(
'C:
\\
Users
\\
CryptFiend
\\
Downloads
\\
python
\\
pic
\\
%s
'
%
name,
'wb+'
)
as
f:
f.write(content)
print
(
'下载第
%s
张图片'
%
i)
i
+=
1
if
__name__
==
'__main__'
:
img
=
download_img()
pageurl
=
img.pageurl()
for
each
in
pageurl:
imglist
=
img.imgurl(each)
img.downloder(imglist)