Python爬取斗图网站

昨天见了快两年没见的“老人们”,女生们一个个越来越有女神范了,男生们一个个都更加社会了。其实还是蛮庆幸酒足饭饱后还能闲谈这么久的,完全没有几年不见的生疏感。刘奶奶唱歌是越来越好听了,青青姐也是越来越漂亮了,帅凯和岸总那是在帅的道路上一去不复返的了,果然活企出来的质量都很高(吹捧一波)。

下面开始文章的正题,今天(代码是昨天写的)要爬取的网站是一个斗图网站,主要是为了解决图荒的问题,所以来爬取这个网站的,不过说实话,这个网站做的还是比较人性化的,没有那么多的反爬虫,整个网站爬下来也是蛮舒服的。

要爬取的网站的URL为 : http://www.doutula.com/photo/list/?page=1

打开第二页会发现第二页的URL为 : http://www.doutula.com/photo/list/?page=2,所以在爬取整个网站的图片信息的时候直接迭代就可以了。(Python环境,以及开发工具上篇博客有讲,这篇开始就直接开始爬取网页了)

爬虫第一步还是去获取整个网页的源代码 :


简单的几行代码就完成了对网站第一页源代码的爬取,因为没有反爬虫,服务器反馈的信息也就是正确的。内容如下 :


爬取到第一页的源代码之后就是找源码中图片信息的位置然后将图片的地址提取出来。首先进入到开发者工具去查看图片的信息(F12进入开发者工具),选中一张图片后,下方代码中属于这张图片的信息处就会变色,如下图 :


在查看多张图片的信息后会发现,图片共有一个class属性,为 : class="img-responsive lazy image_dta" 所以就可以开始提取图片的信息了。首先就是要将网页解析,使用的是BeautifulSoup,然后根据图片公共的属性去提取网页中所有图片的完整信息 :


这样就可以将第一页的所有图片信息打印出来(后面还有信息,截图截不下来了) :


一般来说,图片的地址是存放在img标签下的src中的,但是这里的src下显示的地址是 "//www.doutula.com/build/img/loader.gif",并且所有的src下都是一样的地址,可以看出网站在加载图片之前是没有图片的真正地址的,但是不难发现在img标签下的data-original中保存着图片的真正地址,无论网页是否加载完成,data-original下都有真正的图片地址,接下来就可以从img标签下提取图片的地址了 :


这样就完成了对第一页中所有图片的提取,运行结果如下图所示 :


接下来就是要将爬下来的图片保存到本地磁盘了,首先在工程下新建一个images文件夹,在下载图片时还需在原来的代码中导入两个包 : "import urllib"和“import os“,urllibpython内置的HTTP请求库,ospython标准库中包含普遍操作系统功能:


短短几行代码就可以完成对网站上图片的下载以及保存了。split函数是用来分割图片地址,filename是用来保存分割图片地址的最后一处,作为图片的名称。这样就完成了对单页图片的下载。以上就完成了对网站单页图片的爬取,最后就是将整个网站的图片都爬取下来并保存到本地,要完成对整个网站的爬取,只需将页面进行迭代,并且一页一页的爬取就可以了。迭代过程自己慢慢探索。下面是爬取结果(你工程的文件夹下的images文件夹中会出下好多好多好多张图片,因为整个网站貌似是有6万张图片,像我这样的代码爬图不知道得爬多久,所以我只爬了500+的图片,我还没有学完多线程,多线程会快很多很多):


最后的福利,附上爬虫源代码 (有兴趣的可以自己尝试一下,听说多线程很快啊):

import requests
from bs4 import BeautifulSoup
import lxml
import urllib
import os

BASE_PAGE_URL = 'http://www.doutula.com/photo/list/?page='
PAGE_URL_LIST = []

# 迭代所有页面
for x in range(1,1603) :
    url = BASE_PAGE_URL + str(x)
    PAGE_URL_LIST.append(url)


def download_img(url) :

    split_list = url.split('/')
    filename = split_list.pop()
    path = os.path.join('images',filename)
    urllib.request.urlretrieve(url,filename = path)

def GET_PAGE(page_url) :

    headers = {
        'Host' : 'www.doutula.com',
        'Upgrade-Insecure-Requests' : '1',
        'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.7 Safari/537.36'
    }
    res = requests.get(page_url,headers = headers)
    soup = BeautifulSoup(res.text,'lxml')
    img_list = soup.find_all('img',attrs={'class' : 'img-responsive lazy image_dta'})
    for img in img_list :
        url = img['data-original']
        download_img(url)

def main() :

    for page_url in PAGE_URL_LIST :
        GET_PAGE(page_url)

if __name__ == '__main__' :
    main()





  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值