为什么会选择爬取马蜂窝的游记照片呢?某次在csdn上看到一个博主爬取的案例后,兴趣就油然而生了。因为我刚接触爬虫不久,于是就想借这个案例练习一下,我一直认为,编程之道,越练越熟。本来以为应该会挺容易的,但真正做起来状况百出。主要停留在怎么创建一个文件夹,如何将图片下载到本地文件夹里,至于请求网页,解析网页相对来说还是比较简单的。
我是用selenium来模拟浏览器请求网页的,在马蜂窝上找到一个达人的游记照片,点击照片会跳转到这个游记照片的网页,我们用这个链接作为请求的url,这样只会下载页面显示的这一张照片,至于怎么将所有的照片都下载下来呢?我们这里要用selenium来模拟浏览器操作,代替我们点击下一页切换照片。下图用红线圈起来的就是浏览器要点击实现下一页的按钮,具体操作将用代码来说明。
#声明浏览器对象 browser = webdriver.Chrome() #设置最长等待时间 wait = WebDriverWait(browser,10) PAGE = 214 def search(): #请求网页 browser.get('https://www.mafengwo.cn/photo/10189/scenery_13582798/538498296.html') try: print('正在下载第', 1, '张图片') savePhoto(1) for i in range(2,PAGE): print('正在下载第',i,'张图片') submit = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR,'#_j_photo_container > div > div.albumCon.clearfix > div.albumBox > div.albumImg > div > div.navi.next._j_next'))) submit.click() wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, '.albumWrap .albumBox .albumImg'))) savePhoto(i) except: search()
在得到网页的源码后,我们就要解析网页,获取图片的src,这里我用的pyquery解析库来解析的,因为我发现,pyquery比BS更加的简单,解析源码要提取这个游记的名字,还有照片,照片都在src中,以超链接的形式存放着,这里直接用代码来解释。
def savePhoto(number): html = browser.page_source doc = pq(html) photo_title = doc.find('.album .albumTit h1').text() photo_title = re.sub('【图片】', '', photo_title) photo_href = doc.find('.album ._j_photo') photo_href = photo_href.find('img').attr('src')在获取到我们想要的数据后,就要将照片下载到我们指定的文件夹里了,我们构造一个方法,来创造文件夹,如何新建一个文件夹,我也是第一次接触,我上网查资料,感觉都是一个套路,直接套上模板就行,我概括为五个步骤,1.导入要用到的库,2.指定新建的文件路径,3.去除开头可能有的空格,4.去除尾部可能有的字符,5.判断路径是否存在,看代码会比较直观易懂。
def mkdir(path): #去除首位空格 path = path.strip() #去除尾部\符号 path = path.rstrip("\\") #判断路径是否存在 isExits = os.path.exists(path) if not isExits: os.makedirs(path) return True
新建完文件夹后,就要把照片下载进去了,我一直被困在这里面,不知道怎么向文件夹里保存图片,上网看了不少博客,终于弄明白了。明白了之后觉得挺简单的,就是不会的时候觉得最难哈哈。调用urllib库中的urlretrieve(url,filename)方法,这里要注意filename是文件路径名+照片名+扩展名,还有包括系统路径分隔符的字符串。
path = 'e:\\Photo\\' + photo_title mkdir(path) filename urllib.request.urlretrieve(photo_href, filename=filename)最后得到的效果图: