为什么会选择爬取马蜂窝的游记照片呢?某次在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)
最后得到的效果图: