利用selenium爬取妹子图
一、妹子图爬取前分析
1、首先要知道爬取网站的url,这里妹子图的url就是它https://www.mzitu.com/
2、接着我们分析妹子图的请求方式,看看它以什么方式渲染。这里妹子图只是利用了传统的网页(没有使用Ajax或js)。
3、接着点击进入页面,连续点击下一页,发现url存在一定规律,如图,url最后4会变成5、6、7
4、再查看具体页面的请求方式,这里使用的是GET方法,没有什么特别的。
二、妹子图爬取代码布局
1、大体了解妹子图使用的技术后,我们就可以开始尝试爬取妹子图了,首先我们爬取首页面所有的”妹子“url
2、接着再进入特定的”妹子“页面,再进行具体的”妹子图片“爬取,获取到图片的地址信息
3、最后再将获得的图片地址下载保存在本地即可
注意:妹子图具有简单的反爬虫设置,我们需要设置好请求头,否则下载下来的图片为空。
三、技术使用
很久没有使用selenium,这里我就决定使用它,其他技术都可以,不过,由于妹子图有反爬虫设置,这里需要引入requests包。
四、代码实现
from selenium import webdriver
from lxml import etree
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
import requests
#创建MeiZiTuSpaider类
class MeiZiTuSpaider(object):
#chrome浏览器驱动地址
driver_path = r\'D:\python爬虫相关软件\chromedriver.exe\'
#绑定类的属性
def __init__(self):
self.driver = webdriver.Chrome(executable_path = MeiZiTuSpaider.driver_path)
self.url = \'https://www.mzitu.com/\'
#解析妹子图主页html
def run(self):
self.driver.get(self.url)
#浏览器窗口最大化
self.driver.maximize_window()
#解析主页
source = self.driver.page_source
self.get_page_url(source)
#解析妹子图分类url
def get_page_url(self,source):
tree = etree.HTML(source)
page_urls = tree.xpath(\'//div[@class="postlist"]/ul//li/a/@href\')
for page_url in page_urls:
self.get_img_url(page_url)
#获取图片地址
def get_img_url(self,page_url):
#在新的窗口打开妹子图片页面
self.driver.execute_script("window.open(\'%s\')"%page_url)
#浏览器切换到新的页面,也就是从主页跳转到妹子图片页
self.driver.switch_to_window(self.driver.window_handles[1])
while True:
#找到页面中“下一页»”文本链接元素
next_page = self.driver.find_elements_by_partial_link_text(\'下一页»\')
# 找到页面中“下一页»”元素
next_bnt = self.driver.find_element_by_xpath(\'//div[@class="pagenavi"]/a[last()]\')
#等待页面加载文本链接“下一页»”元素5秒时间,若超过5秒则抛出异常
WebDriverWait(self.driver,timeout=5).until(
EC.presence_of_element_located((By.XPATH,\'//div[@class="pagenavi"]/a[last()]\')))
#若找到页面中“下一页»”文本链接元素,则执行下面代码,否则跳出循环
if next_page:
source = self.driver.page_source
tree = etree.HTML(source)
#获取图片地址
img_url = tree.xpath(\'//div[\'
\'@class="main-image"]/p//img/@src\')[0]
print(img_url)
self.down_img(img_url)
next_bnt.click()
else:
break
#若无法找到页面中“下一页»”文本链接元素,说明此分类的妹子图已经全部找到,然后关闭本浏览器窗口
self.driver.close()
#浏览器窗口切换到主页
self.driver.switch_to_window(self.driver.window_handles[0])
#下载妹子图
def down_img(self,img_url):
# 妹子图有反爬虫机制,需要设置好请求头
headers = {
\'user-agent\': \'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Mobile Safari/537.36\',
\'cookie\': \'Hm_lvt_dbc355aef238b6c32b43eacbbf161c3c=1528013189,1528123045,1528211821,1528376611\',
\'referer\': \'https://www.mzitu.com/\'
}
#文件保存路径
root = "C:\\meizitu\\"
#取出图片地址最后的文件扩展名
pic_num = img_url.split(\'/\')[-1]
#重构图片名称
pic_name = root + \'/\' + pic_num
#二进制保存图片
pic = requests.get(img_url,headers=headers).content
#保存图片
with open(pic_name,\'wb\') as fb:
fb.write(pic)
print("保存成功")
if __name__ == \'__main__\':
spider = MeiZiTuSpaider()
spider.run()