当前位置: 亚洲城ca88 > ca88 > 正文

分类保存到本地和MongoDB数据库,一个简单的爬虫

时间:2019-10-11 05:26来源:ca88
代码已经更新,网站增加了一些headers的反爬限制,简单修改后就能继续使用。 功能:爬取目标网站全部主要图片(例子中是美图录网站的全部写真图片,按人名分类) 本示例使用Pyt

代码已经更新,网站增加了一些headers的反爬限制,简单修改后就能继续使用。

功能:爬取目标网站全部主要图片(例子中是美图录网站的全部写真图片,按人名分类)

本示例使用Python3.5,需要额外安装BeautifulSoup 4

BeautifulSoup 4 安装方法:

Linux:
sudo apt-get install python-bs4

Mac:
sudo easy_install pip
pip install beautifulsoup4

Windows:
下载源码后,
python setup.py install
或者:
pip install beautifulsoup4

具体安装方式见:<a href=";

Python安装

现在的代码,把mongodb保存部分#掉了,直接运行就能保存图片

分析网站结构

python学习 一 python语法,及变量类型

如果保存图片报错,建立一个文件夹F:spiderpicturezhainan2,建立到最后这个zhainan2文件夹,下载的图片都会保存在这里,需要修改的话,在代码中找到相应部分更改。

目标网站<a href="

因为打算下载全部的网页图片,所以从最小的单元开始,也就是图片集(再小就是单一的图片了,也就可以直接下载了)

先打开首页,随便点开一个图片集,发现图片集的地址是这样的
http://www.meitulu.com/item/7487.html
在图片集中检查页面元素,如下所示

<div class="content">
  <center>
    ![[Ugirls尤果网] U181 陈雅漫 写真套图_第1页/第1张图](http://upload-images.jianshu.io/upload_images/2475481-8cdfce535296ab31.jpg?imageMogr2/auto-orient/strip|imageView2/2/w/1240)
  </center>
  <center>
    ![[Ugirls尤果网] U181 陈雅漫 写真套图_第1页/第3张图](http://upload-images.jianshu.io/upload_images/2475481-43e882deb2d0c0cf.jpg?imageMogr2/auto-orient/strip|imageView2/2/w/1240)
  </center>
  <center>
    ![[Ugirls尤果网] U181 陈雅漫 写真套图_第1页/第4张图](http://upload-images.jianshu.io/upload_images/2475481-2d5cb01257ad639e.jpg?imageMogr2/auto-orient/strip|imageView2/2/w/1240)    
  </center>
  <center>
    ![[Ugirls尤果网] U181 陈雅漫 写真套图_第1页/第5张图](http://upload-images.jianshu.io/upload_images/2475481-8e773c5ec770c466.jpg?imageMogr2/auto-orient/strip|imageView2/2/w/1240)
  </center>
</div>

发现每一张主要图片资源链接都在center标签中,这样就可以在这个页面上提取图片链接并下载了
继续向下,发现下图所示,图片并不是存放在一个页面中的

图片 1

页面列表

而检查这里的html代码可以看到

<div id="pages">
  <a class="a1" href="http://www.meitulu.com/item/7487.html">上一页</a>
  1
  <a href="http://www.meitulu.com/item/7487_2.html">2</a>
  <a href="http://www.meitulu.com/item/7487_4.html">4</a>
  <a href="http://www.meitulu.com/item/7487_5.html">5</a>
  <a href="http://www.meitulu.com/item/7487_6.html">6</a>
  <a href="http://www.meitulu.com/item/7487_7.html">7</a>
  <a href="http://www.meitulu.com/item/7487_8.html">8</a>
  <a href="http://www.meitulu.com/item/7487_9.html">9</a>
  <a href="http://www.meitulu.com/item/7487_10.html">10</a>
  ".."
  <a href="http://www.meitulu.com/item/7487_16.html">16</a>
  <a class="a1" href="http://www.meitulu.com/item/7487_2.html">下一页</a>
</div>

这个页面列表在class="pages"的div标签中,当前页是用span标签装饰的,我们可以通过提取 下一页 按钮的链接来继续下载下一个页面的图片,但是我们怎么知道什么时候会到最后一页呢?点击最后一个页面的按钮,这里就是16页。再次检查这一部分的html代码

<div id="pages">
  <a class="a1" href="http://www.meitulu.com/item/7487_15.html">上一页</a>
  <a href="http://www.meitulu.com/item/7487.html">1</a>
  ".."
  <a href="http://www.meitulu.com/item/7487_7.html">7</a>
  <a href="http://www.meitulu.com/item/7487_8.html">8</a>
  <a href="http://www.meitulu.com/item/7487_9.html">9</a>
  <a href="http://www.meitulu.com/item/7487_10.html">10</a>
  <a href="http://www.meitulu.com/item/7487_11.html">11</a>
  <a href="http://www.meitulu.com/item/7487_12.html">12</a>
  <a href="http://www.meitulu.com/item/7487_13.html">13</a>
  <a href="http://www.meitulu.com/item/7487_14.html">14</a>
  <a href="http://www.meitulu.com/item/7487_15.html">15</a>
  16
  <a class="a1" href="http://www.meitulu.com/item/7487_16.html">下一页</a>
</div>

从这段代码中可以看到,下一页 按钮的链接指向的是16页,也就是当前页,而前面的页面指向的都是当前页的下一页。所以我们可以利用这一点来判断是否到最后一页。这样我们就有了下载一个完整图片集的思路了。

python学习 二 爬一个图片网站上

——————————————————————————————

下面我们看看如何获得所有图片集的链接

图片 2

图集分类

发现网站首页有一个图集分类,我们可以认为他把网站上所有的资源都放在这里分好类了,随便点开一个分类,可以看到里面有排列整齐的图集,检查html代码

<div class="boxs">
  <ul class="img">
    <li>
      <a href="http://www.meitulu.com/item/8144.html" target="_blank">
        ![[尤蜜荟] 可乐Vicky 苏梅岛旅拍 第二刊 ~[43]](http://upload-images.jianshu.io/upload_images/2475481-1915763ae66ee8ad.jpg?imageMogr2/auto-orient/strip|imageView2/2/w/1240)
      </a>
      <p>3图片: 43 张(1600X2400)</p>
      <p>机构:
        <a href="http://www.meitulu.com/t/tgod/" target="_blank" class="tags">推女神</a>
      </p>
      <p>模特:
        <a href="http://www.meitulu.com/t/kele-vicky/" target="_blank" class="tags">可乐Vicky</a>
      </p>
      <p>标签:
        <a href="http://www.meitulu.com/t/jipin/" target="_blank" class="tags">极品</a>
        <a href="http://www.meitulu.com/t/nvshen/" target="_blank" class="tags">女神</a>
        <a href="http://www.meitulu.com/t/qingxin/" target="_blank" class="tags">清新</a>
        <a href="http://www.meitulu.com/t/qingchun/" target="_blank" class="tags">清纯</a>
        <a href="http://www.meitulu.com/t/weimei/" target="_blank" class="tags">唯美</a>
        <a href="http://www.meitulu.com/t/huwai/" target="_blank" class="tags">户外</a>
        <a href="http://www.meitulu.com/t/yangyan/" target="_blank" class="tags">养眼</a>
      </p>
      <p class="p_title">
        <a href="http://www.meitulu.com/item/8144.html" target="_blank">[尤蜜荟] 可乐Vicky 苏梅岛旅拍 第二刊 ~</a>
      </p>
    </li>
    "..."
    <!--为了方便查看,这里省略了一堆li标签-->
  </ul>
</div>

从这段代码中可以发现,所有的图集被放在了<div class="boxs">标签中,每个图集的信息中包含模特名字,发行机构和一系列的标签。每一个信息对应一个链接,链接中是包含对应信息的图集的分类页面,这里我们按照人名分类,所以只要检索 模特 关键字就可以了。
这段页面的下方也是一个页面列表,检查html元素会发现与图集的列表模式相同。

另外,对于某些只有一个图集的人来说,他没有对应的分类页面,对于这些人要另外处理

python学习 二 02 爬一个图片网站,获得主链接网址,并保存

这一系列的爬虫,都是网上不存在,自己找到的感兴趣的网站进行分析爬取。

小结

根据这些特征,我们遍历分类页面中的所有图集,通过字典记录人名对应的链接,如果遇到没有分类页面的人,则直接创建文件夹,下载图集。这样我们前期的分析工作就完成了,下面

python学习 二 03 爬一个图片网站-获得所有分页网址

也当作自己的动手实践吧,GO!

开始写爬虫吧

先初始化几个要用到的全局变量

categaries = {}                        # 分类列表
person = {}                            # 人名列表
PATH = os.getcwd()                     # 根目录路径
forbidchar = r'<|>|/|\|||:|"|*|?'  # 系统禁止用作文件名的字符,正则表达式

python学习 二 04 爬一个图片网站-解析文件,获得所有图片链接

爬取网页:百度搜索“宅男女神”,第一个搜索结果。

一、图片下载函数

首先,我们要下载网站上所有的图片,所以需要有一个给定图片链接就能下载下来的函数:

def downloadimg(link, name):            # link为图片链接,name为图片名字
    data = urlopen(link, timeout=10)    # 打开连接
    tname = name ".jpg"                 # 给图片命名
    with open(tname, "ab") as code:     # 以追加二进制模式打开文件,并保存数据
        code.write(data.read())
    print(tname " is done.")            # 打印提示文字

但这还不够,因为经常会碰到链接没有响应的情况,所以加上异常处理

def downloadimg(link, name):
    name = re.split(forbidchar, name)
    name = '.'.join(name)     # 通过re模块的split,将windows不支持的文件名符号,全部换成'.'
    for i in range(10):
        time.sleep(0.5) # 照顾别人服务器的带宽,适当加点延时。。。加多少看你心情
        try:
            data = urlopen(link, timeout=10)
            tname = name ".jpg"
            with open(tname, "ab") as code:
                code.write(data.read())
            print(tname " is done.")
            break
        except Exception:
            time.sleep(3) # 多数情况下,上面的语句中只有urlopen会出现无响应的异常,这时等待三秒,重新发送请求

python学习 二 05 爬一个图片网站-下载图片链接

(收藏数是点赞数的十倍!这你敢信?顺便求个赞吧,哈。)

二、图集下载函数

更进一步的,我们要处理一个给定链接的图集,首先我们写一个下载当前页面的主要图片的功能

def downloaditem(link, ):
    html = urlopen(link, timeout=100)          # 打开链接
    bsObj = BeautifulSoup(html, "html.parser") # 用bs解析html

    for center in bsObj.findAll("center"):     # 找到所有的center标签
        for img in center.findAll("img"):      # 找到其中包含img标签的
            boola = downloadimg(img.attrs['src'], img.attrs['alt'])
                                               # 下载image,并以图片的alt属性内容给图片命名

但这还没完,记得前面提到的页面列表么,我们还要继续下载 下一页 的图片。于是继续

def downloaditem(link, ):
    html = urlopen(link, timeout=100)
    bsObj = BeautifulSoup(html, "html.parser")

    for center in bsObj.findAll("center"):
        for img in center.findAll("img"):
            boola = downloadimg(img.attrs['src'], img.attrs['alt'])
#---------------------------------------------------------------------------
    page = bsObj.find("div", {"id":"pages"})   # 找到所有id属性为pages的div标签
    for a in page.findAll("a", {"class":"a1"}):
                                               # 找到其中class属性为a1的a标签
        if re.search(re.compile(r'下一页'), a.getText()):
                                               # 如果标签内容包含下一页
            number = re.search(re.compile(r"http://www.meitulu.com/.*?_([0-9]*?).html"), a.attrs['href'])
                                               #用正则表达式匹配链接中的页码
            if number:                         #如果匹配成功,失败时number为None
                link = number.group(0)         #提取页面链接
                number = number.group(1)       #提取页码
                if number != page.find('span').getText():
                                               #如果链接的页码跟当前页码不同,则不是最后一页,
                    print("download deeper...")#输出提示信息
                    downloaditem(link)         #继续下载下一页

完善一下代码,添加异常捕捉和延时

def downloaditem(link, ):
    for i in range(10):
        time.sleep(1)
        try:
            html = urlopen(link, timeout=100)
            break
        except Exception:
            print("Url Erroe")
            time.sleep(2)

    for i in range(10):
        try:
            bsObj = BeautifulSoup(html, "html.parser")
            break
        except Exception:
            print("Soup Error")

    for center in bsObj.findAll("center"):
        for img in center.findAll("img"):
            boola = downloadimg(img.attrs['src'], img.attrs['alt'])

    time.sleep(2)
    page = bsObj.find("div", {"id":"pages"})
    for a in page.findAll("a", {"class":"a1"}):
        if re.search(re.compile(r'下一页'), a.getText()):
            number = re.search(re.compile(r"http://www.meitulu.com/.*?_([0-9]*?).html"), a.attrs['href'])
            if number:
                link = number.group(0)
                number = number.group(1)
                if number != page.find('span').getText():
                    print("download deeper...")
                    downloaditem(link)

python学习 二 06 爬一个图片网站-多线程方式下载

目的:

三、获取人名分类下的所有图集链接

def downloadperson(link, name):
    name = re.split(forbidchar, name)
    name = '.'.join(name)                      # 跟图片文件名原理一样,替换被禁止的字符
    personitems = {}

    if not os.path.exists(name):               # 检查这个人的文件夹之前有没有创建
        os.mkdir(name)                         # 如果没有就创建一个
    os.chdir(name)                             # 进入这个目录

    html = urlopen(link, timeout=100)          # 打开链接
    bsObj = BeautifulSoup(html, "html.parser") # 用bs解析


    for boxs in bsObj.findAll("div", {"class":"boxs"}): # 找到装载图片集的<div>标签
        for li in boxs.findAll("li"):                   # 处理每一个图片集
            for p in li.findAll('p', {"class":"p_title"}): # 找到包含图片链接的p标签
                psn = p.find('a')
                personitems[psn.getText()] = psn.attrs['href'] # 用文件名作为key给字典添加图集链接

    PATHtmp = os.getcwd()                      # PATHtmp是这一层人名文件夹的路径
    for key in personitems:                    # 遍历字典,下载每一个图集
        print('n', "downloading ", key, 'n')
        if not os.path.exists(key):            # 检验文件夹是否存在
            os.mkdir(key)
        os.chdir(key)                          # 进入文件夹
        downloaditem(personitems[key])         # 下载图集
        os.chdir(PATHtmp)                      # 回到上一层目录,这里用的绝对路径,避免中途被打断导致后面的下载也出现错误

    os.chdir(PATH)                             # 回到根目录

完善代码,添加异常捕捉和延时,这里因为同一个人没有发现有多页的情况,所以没有处理页面列表的代码

def downloadperson(link, name):
    name = re.split(forbidchar, name)
    name = '.'.join(name)
    personitems = {}

    if not os.path.exists(name):
        os.mkdir(name)
    os.chdir(name)

    for i in range(10):
        time.sleep(1)
        try:
            html = urlopen(link, timeout=100)
            break
        except Exception:
            time.sleep(2)
            print("Url Erroe")

    for i in range(10):
        try:
            bsObj = BeautifulSoup(html, "html.parser")
            break
        except Exception:
            print("Soup Error")

    for boxs in bsObj.findAll("div", {"class":"boxs"}):
        for li in boxs.findAll("li"):
            try:
                for p in li.findAll('p', {"class":"p_title"}):
                    print('n',p,'n')
                    psn = p.find('a')
                    personitems[psn.getText()] = psn.attrs['href']
            except:
                print("Find Error")

    PATHtmp = os.getcwd()
    for key in personitems:
        print('n', "downloading ", key, 'n')
        if not os.path.exists(key):
            os.mkdir(key)
        os.chdir(key)
        downloaditem(personitems[key])
        os.chdir(PATHtmp)

    os.chdir(PATH)

python学习 三 01 再爬一个网站,几行代码,搞定分类类别

  1. 爬取网站大量图片
  2. 对于抓取的图片进行分类保存

四、获得分类下所有人名的分类链接

def getperson(link,):
    for i in range(10):
        time.sleep(1)
        try:
            html = urlopen(link, timeout=100)           # 打开连接
            break
        except Exception:
            time.sleep(2)
            print("Url Erroe")

    for i in range(10):
        try:
            bsObj = BeautifulSoup(html, "html.parser")  # bs解析
            break
        except Exception:
            print("Soup Error")

    for boxs in bsObj.findAll("div", {"class":"boxs"}): # 获取分类下包含图集的标签
        for li in boxs.findAll("li"):                   # 逐个图集处理
            try:
                for a in li.findAll('p'):
                    print(a.getText())                  # 输出图集提示信息
                    name = re.search(re.compile(r'^模特:(.*?)$'), a.getText())
                    if name:
                        psn = a.find('a')               # 尝试查找人名分类页面链接
                        person[psn.getText()] = psn.attrs['href']
            except:                                     # 如果找不到分类页面,则直接下载图集
                print("downloading item..." name.group(1))
                item = li.find('p', {"class":"p_title"}).find("a")
                print(item.getText())
                if not os.path.exists(name.group(1)):
                    os.mkdir(name.group(1))             # 创建人名文件夹
                os.chdir(name.group(1))                 # 进入人名文件夹
                print(name.group(1))
                name = item.getText()                   # 提取图集
                name = re.split(forbidchar, name)       # 处理图集名(文件夹名)
                name = '.'.join(name)
                if not os.path.exists(name):
                    os.mkdir(name)                      # 创建图集文件夹
                os.chdir(name)                          # 进入图集文件夹
                downloaditem(item.attrs['href'])        # 下载图集
                os.chdir(PATH)                          # 回到根目录


    time.sleep(3)                                       # 延时
    page = bsObj.find("div", {"id":"pages"})            # 处理下一页问题,原理同downloaditem函数
    for a in page.findAll("a", {"class":"a1"}):
        if re.search(re.compile(r'下一页'), a.getText()):
            number = re.search(re.compile(r"http://www.meitulu.com/t/.*?([0-9]*?).html"), a.attrs['href'])
            link = number.group(0)
            number = number.group(1)
            if number != page.find('span').getText():
                print("scrap deeper...")
                getperson(link)
                break

python学习 三 02 再爬一个网站,获得所有分页

参考学习资料:

五、主函数

if __name__ == "__main__":
    for i in range(10):
        time.sleep(1)
        try:
            html = urlopen("http://www.meitulu.com", timeout=100) # 打开首页链接
            break
        except Exception:
            print("Url Erroe")
            time.sleep(2)

    for i in range(10):
        try:
            bsObj = BeautifulSoup(html, "html.parser")            # bs解析
            break
        except Exception:
            print("Soup Error")

    for a in bsObj.find("li", {"id":"tag"}).find("ul", {"id":"tag_ul"}).findAll("a"):
        categaries[a.getText()] = a.attrs['href'] # 获取所有分类首页的链接,以分类名为key

    for key in categaries:
        time.sleep(3)
        print(i,"loading page..." key)
        getperson(categaries[key])                # 获取每一个分类下的所有人名链接

    for key in person:
        downloadperson(person[key], key)          # 下载每一个人名下的所有图集

python学习 三 03 再爬一个网站,根据分页,下载图片

  1. 如何学习Python爬虫[入门篇]?(强烈推荐!十分有用!里面有关python学习线路很适合大众,爬虫的相关学习难度也很适中)
  2. Python3 教程 | 菜鸟教程
  3. 快速上手 - Requests 2.18.1 文档
  4. Beautiful Soup 4.2.0 文档

总结

完整代码在这里:<a href=";
我在代码中延时加的比较多,所以运行起来有些慢,但毕竟这只是个练习,照顾一下别人服务器比较好= =。

Python 爬虫 上篇

环境配置:

Python 爬虫 下篇

  1. 系统环境:WIN8
  2. 编译环境:Python3.5
  3. 所需库:requests、re、os、pymongo、Beatifulsoup、time
  4. IDE:Pycharm

Python 爬虫 上篇

学前疑惑:

Python爬虫学习 第一篇 准备

  1. 如何找到各个图片的地址接口
  2. 如何遍历图片地址,批量保存图片
  3. 如何保证爬虫能长期运行不中断

近期使用python用来爬取网络图片,之前也有分章介绍,这次统一汇总介绍下我的爬虫过程。

分析网站:

爬虫是啥

作为一个爬虫新手,分析网站思路的学习是我之前学习过程中花费时间精力最大的部分。这次要爬取的网站,来自于百度搜索,宅男女神的第一个结果网站。首先打开F12,观察界面中各个图集的入口信息,发现href标签中带有信息/g/24699/,而后面这个五位数是决定图集不同的主要因素。而且,越是最新的图片,数字越大。网站是通过时间差异来给图集编号,那么只要我遍历所有编号,就能获得所有图片集地址信息了。通过手动测试发现,按顺序编号,不一定存在图集,所有需要一个函数来筛选出有效的详情图片集网址。

网络爬虫是什么?

获得详情页地址以后,分析详情页。我们需要抓取,详情页中的标题,图片地址,图片个数。观察图片地址发现, ,图片的来源格式类似于上面这个链接,同个图集下,除了结尾的三位数030不会改变,其他地方不变。通过获得图片集图片个数,确定有效图片范围,再通过获得图片集地址的固定要素,构造图片集内所有图片的获得链接。

看意思是一个虫子,一个什么虫子?实际上指的是蜘蛛spider。

获得图片链接后,只需要保存访问图片链接的response.content,即可实现图片下载保存。通过os库进行文件夹创建,分类保存。再设置格式,保存至MONGODB数据库

蜘蛛结成网,在网上爬来爬去的寻找坠入网络中的食物。

具体一分析,是不是发现挺简单的!虽然,在崔大视频里面很多爬虫的网站都带有一些难度,比如动态网站,今日头条,里面的图片链接信息就会比较隐蔽,需要多多发现才能找到。但是,这次的这个网站爬取难度还是非常低的,只需要思路清楚,接下来就是自己实现过程中的各种小问题的解决,多查百度,就能搞定了。

网络爬虫就是差不多的意思,在互联网上爬来爬去的寻找你的精神食物。

这个爬虫思路还有改善空间,比如说有效图片地址,可以单独设置一个py文件,去运行,保存的地址都是有效地址,就无需自己从10000遍历到30000这么多了。提取以后,遍历有效地址列表就好了。因为爬取量比较大,还可以加上多线程,加快运行速度。

开始爬前的准备

代码已经是纯傻瓜式,只要有requests和beautifulsou这两个库,就能开始自动运行保存。

要开始爬,你得先知道爬哪里吧,你得先获得网页的源码即HTML信息吧,获得后,你需要分析出链接和图片等资源吧。

如果要自己修改爬取范围,贼修改代码最上方的start和end,自己打开网站找到需要爬取的图集,或者直接遍历从10000-30000之间。

要获取HTML并分析网页信息,需要下载一个第三方的库requesets,下载地址:

成果:(吐槽两句,之前竟然被举报,知乎说违反了法律法规,那还是低调一些吧。)

下载并解压

运行了几十分钟,就抓了5000多张图片。

图片 3

运行久一些,整个网站所有图片你都能抓下来。

最重要的是 这个库有完善的中文资料 ,讨厌蝌蚪文的可以放心的参考

图片 4image图片 5image.gif

你如果和我一样使用pycharm来编辑,加入第三方库的步骤如下:

图片 6

如果需要特别图片类型分类的话,可以写一个爬取网站中指定分类下图集链接,再遍历爬取。

图片 7

全部代码:图片 8Xshot-0016.png

图片 9

你对你自己要求的的学习目标,完成了吗?

安装好requests第三方库后,开始测试

如果还未完成,如果你心动的话。

开始获取HTML

关注我~

图片 10

我会继续学习和总结,希望能给你带来一些帮助。

图片 11

与大家共勉,继续努力!欢迎私信交流~

怎么样,惊喜不惊喜,简单不简单,使用其它语言,无法用这么简单的语句就获得html的信息。

觉得这篇文章对你有帮助的话,帮忙点个赞~

解析HTML

这也是我动力的来源,谢谢各位。

使用request获取了网页源码,下一步就是如何解析了,你如果用过C 等语言,你会发现很难找到顺心的网页解析库,但python在这方面却很擅长。

python学习交流群 984632579 除了分享技术文章之外还有很多福利,加群领取学习资料可以领取包括不限于Python实战演练、PDF电子文档、面试集锦、学习资料等。

还是用一个第三方库 Beautiful Soup

这是个什么库呢?

直译为:漂亮的汤?

难道是将网页作为美味的汤,从这汤里慢慢品味其中滋味,抽丝剥茧的分析汤的构成成分、汤的味道? 老外的思路,真难猜,先不管这个了。

说白了,就是用来解析HTML或XML,从中提取有用数据的库。

而且也有强大的中文支持

图片 12

图片 13

首先分析,解析哪些链接

图片 14

这应该是按类别来分的,我们在源码中找到这一项

图片 15

之所以有乱码,很可能是与我电脑没有日文字体有关也可能编码不正确,先不管它了,目前对解析无影响,可以看出,这些类别是放在class=menu的div下了,具体的就是这个DIV下的

1、好了,首先第一步,获得这个DIV

图片 16

这样我们就获得了这个DIV的内容,下面再继续解析这个DIV

2、解析DIV

解析这个DIV,还要以这个DIV内容为参数,构造一个BeautifulSoup(以下简称为BS :) 注意绝不是鄙视的意思)对象,因为全篇只有一个menu 类型的DIV,所以所有类型都保存在上面解析的div_menu[0]中了,将这个对象强制转换为字符串类型做BS的参数

图片 17

看源码可以发现,链接都是站内链接

图片 18

现在注意了,我要把所有的链接提取出来

图片 19

输出所有的链接

图片 20

图片 21

对应HTML源码

图片 22

可以看到,第一个 a标签,是没有href属性的,所以,会输出None,其它a标签,正常输出

因为这些都是站内链接,

我们先定义一个变量,表示该站的域名

图片 23

又因为,有的链接可能是none,所以需要判断下是否存在href属性,下面是输出所有链接的代码

图片 24

输出的链接如下:

图片 25

这样,我们就正确的获得了这些类别对应的网址了。

下一步工作,下一节再说,现在还有些事,改天聊

第二篇

书接上回,上文书说道,我们已经获得了所有类别的链接。

下面我将这些链接保存到一个临时文件中,其实不保存也可以,但开始学python,借这个机会,也练练如何创建目录,保存文件。

将上文获得的主链接保存到文件中

定义一个函数,搞不懂,为什么python不用C语言那样的定义函数,也不用C语言的那样的循环和跳转,一时用惯了别的语言的人,很难一下子转过来。

这是写的将链表中的链接,保存到文件中去,

图片 26

写到一个文件中,有点乱,因此,我又新建了一个py文件,用以编写常用的函数,取名为common.py

下载获得的主链接

因为我把所有的常用函数,写到common.py中了,所以要导入这个文件

图片 27

主程序中,要用到这个common中自定义的保存函数

图片 28

图片 29

经过测试,可以将列表内容,写入文件了。

现在,我又看了看,觉得很乱,我想单独的建立一个目录tmp,用来保存临时文件

目录文件相关的,要引入os

图片 30

图片 31

不管怎么说,使用下面代码,已经把所有的链接都保存在临时文件中。

图片 32

图片 33

第三篇

本节思路

理一理逻辑,先不去考虑细节,逻辑理清了,根据这个逻辑去实现细节就好了。我也是第一次使用python,也没有时间看文档,因为想获得图片素材,直接就想爬一个网站。

我们之前,已经分析了首页,获得了图片类别对应的链接,并将这些链接保存在了本地文件中。

下面,

第一步,我们会下载主链接网页,保存在本地文件中。

第二步,分析主链接,获得相应的所有分页网址

第三步,将主链接及分页链接,统统下载下来

下载下来后,后续我们会解析网页,获得图片地址,下载图片,本节主要完成前三步即可。

下载主链接网页,保存在本地

上文,我们将首页中主链接保存了起来,

图片 34

下面,为了免去每次下载网页的麻烦,我们一次性下载这些网页,并保存在本地中

主文件中,就一句话,因为细节都封装在另一个文件中了,我们主要考虑逻辑,细节可以通过查资料去实现,去调试。

图片 35

这是common.py中写的下载函数

图片 36

其中调用了单个网址下载函数downHtml

图片 37

通过上述代码,已经将链接下载到了本地。

获得分页链接

上文提到,解析了首页,将所有的主分类链接保存到了本地文件中。

我们再打开一个主链接看看

图片 38

每个主链接,都有相应的分页链接

我们下面的目的,就是获得主链接对应的所有分页链接

分析网页源码

图片 39

分页链接保存在class=link2的 div下

图片 40

其中,获得分页链接的代码如下:

图片 41

将所有的链接对应的网页,下载到本地

图片 42

图片 43

这是下载后的本地文件

图片 44

第四篇

本节目的:解析下载到本地的文件,获得图片链接

图片 45

所有相关的网址,都下载到本地了,下面我们依次解析,获得图片链接,然后将图片链接保存起来。

由上图,可看到

图片 46

是一组,保存着背景图片,那我们解析的时候,将这一组图片,单独的放在一个文件夹background中

图片 47

是另一组,解析的时候,单独的放在一个文件夹中

第一步,我们遍历目录,获得所有的文件路径

为此,我写了个函数

#目录下的文件和文件夹def GetAllSubFile(dir,list):

#目录下的文件def GetAllSubFile(dir,list,ext):

#目录下的文件夹def GetAllSubDirs(dir,list):

图片 48

调用

txtFileList=[]common.GetAllSubFile(tmpDir "htmls",txtFileList,"txt")

获得目录下的txt文件路径,保存在txtFileList中。

第二步 解析文件,获得IMG路径

1、 首先,针对不同分组,创建相应的子目录

图片 49

是一组,保存着背景图片,那我们解析的时候,将这一组图片,单独的放在一个文件夹background中

我们将右侧的数字去掉,剩下的字符串作为这一组的类别

图片 50

图片 51

分析源码

图片 52

图像链接保存在class=subcontents的div下,

为此我写了个函数

图片 53

图片 54

调用

common.FindAllImg(txtFile,"div","subcontents","data-layzr")

获得文件中,所有图片的链接列表,、

图片 55

图片 56

这一过程的代码如下:

图片 57

第五篇

下载图片链接

本节的主要任务是下载文件中获得的图片链接

图片 58

为此我写了个函数

def downImg(httpPath,localPath):

实测中,考虑到有些链接不存在,有些链接超时,有些链接其它错误,所以一次下载不了,多次尝试。

而且使用request.urlretrieve(httpPath,localPath) 直接下载时,出现出现10060错误,于是使用request.urlopen(httpPath,timeout=60),然后以读的方式进行下载。

图片 59

我这的目录结构是这样的

图片 60

图片 61

第一步,读取所有的子文件夹

第二步,读取子文件夹下的img.txt

第三步,下载img.txt中的链接

为此,我又写了下面的函数

图片 62

图片 63

DownThumbnail 是下载缩略图,因为这个网站上,目前或的的这些链接对应的是缩略图。

运行后,就会发现,可以下载了

图片 64

目前是单线程方式下载的缩略图

下一节介绍下多线程方式,下载高清图

第六篇

多线程方式下载

图片 65

图片 66

使用:

图片 67

下载下的图片,

多线程下载速度是比单线程要快一些

图片 68

对您有所启发的话,欢迎扫下红包奥

图片 69

编辑:ca88 本文来源:分类保存到本地和MongoDB数据库,一个简单的爬虫

关键词: 亚洲城ca88