利用BeautifulSoup、urllib、selenium爬取动态网站图片

1、导入相关包

from selenium import webdriver
from bs4 import BeautifulSoup
from urllib.parse import urlparse
import time
from urllib import request
import re

2、定义代理,防止被服务器拦截

global headers
headers={
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36',
            'Accept':'application/json, text/javascript, */*; q=0.01',
            'Accept-Encoding':'gzip, deflate',
            'Accept-Language':'zh-CN,zh;q=0.9',
            'Connection':'keep-alive'}

3、定义函数,获取图片的url

driver = webdriver.Chrome()
def getimgurl(url):
    imglist=[]#初始化图片url列表
    driver.get(url)#完全载入之后才会进行下一步操作
    execute_times(5)

    #先利用slenium对网页进行处理
    print(url)
    html=driver.page_source
    soup=BeautifulSoup(html,'html.parser')
    try:
        img_=soup.find_all('img') #找到所有含img的标签
    except:
        print('有问题')
        pass
    for each in img_:
        a=str(each.get('srcset'))
        if a!='None':
            #由于网址的特殊构造,可以依据第一个问号出现之前的为图片的真正链接
            for i in range(len(a)):
                if a[i]=='?':
                    imglist.append(a[:i])
                    break
    print(len(imglist))
    download_img(imglist, n)  # 利用获取的图片url获取图片
    return print('Down')

4、定义对浏览器的操作,涉及到selenium

#函数,实现将滚轮滑到页面最下方的功能,这个在官方文档中有
# (为了让页面载入完整,每10秒下移一次=)
def execute_times(times):
    for i in range(times+1):
        driver.execute_script("window.scrollTo(0,document.body.scrollHeight)")
        time.sleep(10)

5、定义下载图片函数

def download_img(imglist,n):

    global headers
    for imgurl in imglist:
        time.sleep(2)
        n+=1
        print('下载图片%s中' % n)
        filename = ('E:\Pr\images%s.jpg'%n)
        req = request.Request(url = imgurl, headers = headers)
        binary_data = request.urlopen(req).read() #获取图片的二进制数据
        temp_file = open(filename, 'wb') #创建文档
        temp_file.write(binary_data)#将二进制文件写入文档中
        temp_file.close() #关闭文档
        #这种下载方法总是被禁 request.urlretrieve(imgurl, path + '%s.jpg' % n)  # 下载图片,并以path+数字的格式进行命名
        print('下载图片%s完毕' % n)
        if n>20:
            break


你可能感兴趣的:(Python,爬虫)