基于python3.7的爬取马蜂窝旅游的游记照片

为什么会选择爬取马蜂窝的游记照片呢?某次在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)

最后得到的效果图:

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值