当前位置 博文首页 > 小航冲冲冲的博客:python爬虫爬取美女图片(selenium)

    小航冲冲冲的博客:python爬虫爬取美女图片(selenium)

    作者:[db:作者] 时间:2021-07-04 09:58

    之前爬一个美女图片网站,因为是动态加载网站,爬下来的图片全是转呀转的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]

    cs