之前爬一个美女图片网站,因为是动态加载网站,爬下来的图片全是转呀转的GIF图,气死我了,学了selenium之后,龙王归来,势在必得
先看需要的库
from selenium import webdriver
from lxml import etree
import time
import requests
我们使用selenium去打开页面
#实例化了一个浏览器对象(一定要传入浏览器的驱动程序)
wd = webdriver.Chrome(executable_path=r'./chromedriver/chromedriver.exe')
#打开网站
wd.get('这里写你要爬的网址,这里就不方便展示了')
# UA伪装请求头
header = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chromeh/81.0.4044.138 Safari/537.36'
}
selenium获取网页源码
page_text = wd.page_source
再使xpath去获取图片地址
tree = etree.HTML(page_text)
tr = tree.xpath('//div[@class="nbodys"]/img/@src')
爬完之后发现一个问题,依旧出现转呀转的GIF图,是因为这个网站的图片是动态加载,必须要慢慢去滚动页面,才能加载出来
我们使用js的下拉页面,使用for循环一点一点的下拉
for i in range(1,20000,500):
wd.execute_script("window.scrollTo(0, %s);"%i)
page_text = wd.page_source
tree = etree.HTML(page_text)
这里又出现问题,图片网址夹杂在一堆相同的GIF图地址之中,而且爬出来的h图网址有重合的地方,是因为selenium下拉500的话,会有地方重合爬取
我们需要使用遍历,将一个一个网址遍历出来,再设定一个列表,然后再去判断是否为转呀转GIF图的网址,不是的话,就存在列表之中,再将列表进行去重,最后得到正确的网址
#创建一个空的列表
num = []
#将爬出东西的遍历
for trr in tr:
#去除障碍信息
if trr != '/Public/images/tian/loadpic.gif':
#将爬取到的图片地址存储到num中
um.append(trr)
#去重
num = list(set(num))
最后进行下载图片
for sum in num:
#魔鬼细节:网站程序员在jpg后面加了空格防爬,去除即可
sum = sum.replace(' ','')
#剪切网址序号作为图片名字
sy = sum[-6:-4]
#去除下划线
sy = sy.replace('_', '')
img = requests.get(url=sum, headers=header).content
imgpath = './selenium-图片/' + sy + '.jpg'
with open(imgpath, 'wb') as fp:
# 传入二进制内容
fp.write(img)
print(sy,'爬取成功!')
print("爬取成功")
完整代码
from selenium import webdriver
from lxml import etree
import time
import requests
#实例化了一个浏览器对象(一定要传入浏览器的驱动程序)
wd = webdriver.Chrome(executable_path=r'./chromedriver/chromedriver.exe')
#打开网站
wd.get('这里写你要爬的网址,这里就不方便展示了')
# UA伪装请求头
header = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chromeh/81.0.4044.138 Safari/537.36'
}
#创建一个空的列表
num = []
print("开始爬取...")
for i in range(1,20000,500):
wd.execute_script("window.scrollTo(0, %s);"%i)
page_text = wd.page_source
tree = etree.HTML(page_text)
tr = tree.xpath('//div[@class="nbodys"]/img/@src')
#将爬出东西的遍历
for trr in tr:
#去除障碍信息
if trr != '/Public/images/tian/loadpic.gif':
#将爬取到的图片地址存储到num中
num.append(trr)
time.sleep(1.5)
#去重
num = list(set(num))
for sum in num:
#魔鬼细节:网站程序员在jpg后面加了空格防爬,去除即可
sum = sum.replace(' ','')
#剪切网址序号作为图片名字
sy = sum[-6:-4]
#去除下划线
sy = sy.replace('_', '')
img = requests.get(url=sum, headers=header).content
imgpath = './selenium-图片/' + sy + '.jpg'
with open(imgpath, 'wb') as fp:
# 传入二进制内容
fp.write(img)
print(sy,'爬取成功!')
print("爬取成功")
最终的图片就不放出来了,反正非常舒服,这里是提供一个思路,大家注意身体[dog]