zoukankan      html  css  js  c++  java
  • Python网络爬虫(6)--爬取淘宝模特图片

          经过前面的一些基础学习,我们大致知道了如何爬取并解析一个网页中的信息,这里我们来做一个更有意思的事情,爬取MM图片并保存。网址为https://mm.taobao.com/json/request_top_list.htm。这个网址有很多页,通过在网址后添加?page=页码来进入指定的页。

          为了爬取模特的图片,我们首先要找到各个模特自己的页面。通过查看网页源码,我们可以发现,模特各自的页面的特点如下:

    我们可以通过查找class属性为lady-name的标签,然后取其href属性来获取各个模特各自的页面地址。

    1 html = urlopen(url)
    2 bs = BeautifulSoup(html.read().decode('gbk'),"html.parser")
    3 girls = bs.findAll("a",{"class":"lady-name"})
    4 for item in girls:
    5     linkurl = item.get('href')

        继续分析模特各自的页面的特点,模特页面打开后的页面布局如下:

          在这个页面中我们要提取的是模特的个性域名,这个域名打开后,里面就有模特的图片了。那么我们的关键问题就是如何提取这个域名。按我们之前的学习,我们会去查找这个标签,但是我们打开网页源码会发现网页源码里面并没有包含这个信息。这是因为这一部分的信息是用JS动态生成的。那么这种情况下我们怎么办呢?

          答案是使用selenium和PhantomJS,相关的概念可以自行百度。简而言之,PhantomJS是一个无界面的浏览器,而selenium是一个测试浏览器的工具,结合这2者,我们就可以解析动态的页面了。

          获取模特的个性域名的代码如下:

     1 def getUrls(url):
     2     driver= webdriver.PhantomJS()
     3     html = urlopen(url)
     4     bs = BeautifulSoup(html.read().decode('gbk'),"html.parser")
     5     girls = bs.findAll("a",{"class":"lady-name"})
     6     namewithurl = {}
     7     for item in girls:
     8         linkurl = item.get('href')
     9         driver.get("https:"+linkurl)
    10         bs1 = BeautifulSoup(driver.page_source,"html.parser")
    11         links = bs1.find("div",{"class":"mm-p-info mm-p-domain-info"})
    12         if links is not None:
    13             links = links.li.span.get_text()
    14             namewithurl[item.get_text()] = links
    15             print(links)
    16     return namewithurl

          在这里,我们使用PhantomJs去加载动态的页面,然后用BeautifulSoup去规则化加载后的页面,接下来的工作就与普通的网页相同了。

          接下来分析模特的个人主页的特点,直观上是这样的页面:

    分析源码后我们会发现,模特的图片地址可以这样获取:

    1 html = urlopen(personurl)
    2 bs = BeautifulSoup(html.read().decode('gbk'),"html.parser")
    3 contents = bs.find("div",{"class":"mm-aixiu-content"})
    4 imgs = contents.findAll("img",{"src":re.compile(r'//img.alicdn.com/.*.jpg')})

    如此我们就能获取模特的个人域名地址中的图片了,接下来的问题就是如何保存图片了。

    我们可以用urllib中的urlretrieve函数来完成保存的工作。

    用法为urlretrieve(imgurl, savepath)

    再加入多线程等代码,完整的爬虫代码为:

     1 #coding = utf-8
     2 from urllib.request import urlopen
     3 from urllib.request import urlretrieve
     4 from urllib.error import HTTPError
     5 from selenium import webdriver
     6 from selenium.webdriver.common.by import By
     7 from bs4 import BeautifulSoup
     8 from multiprocessing.dummy import Pool as ThreadPool
     9 import sys,os
    10 import re
    11 
    12 savepath=r".save"
    13 
    14 def mkdir(path):
    15     if os.path.exists(path):
    16         return
    17     os.mkdir(path)
    18 
    19 def getUrls(url):
    20     driver= webdriver.PhantomJS()
    21     html = urlopen(url)
    22     bs = BeautifulSoup(html.read().decode('gbk'),"html.parser")
    23     girls = bs.findAll("a",{"class":"lady-name"})
    24     namewithurl = {}
    25     for item in girls:
    26         linkurl = item.get('href')
    27         driver.get("https:"+linkurl)
    28         bs1 = BeautifulSoup(driver.page_source,"html.parser")
    29         links = bs1.find("div",{"class":"mm-p-info mm-p-domain-info"})
    30         if links is not None:
    31             links = links.li.span.get_text()
    32             namewithurl[item.get_text()] = links
    33             print(links)
    34     return namewithurl
    35 
    36 def getImgs(parms):
    37     personname = parms[0]
    38     personurl = "https:"+parms[1]
    39     html = urlopen(personurl)
    40     bs = BeautifulSoup(html.read().decode('gbk'),"html.parser")
    41     contents = bs.find("div",{"class":"mm-aixiu-content"})
    42     imgs = contents.findAll("img",{"src":re.compile(r'//img.alicdn.com/.*.jpg')})
    43     savefilename = os.path.join(savepath,personname)
    44     mkdir(savefilename)
    45     print("img num :",len(imgs))
    46     cnt = 0
    47     for img in imgs:
    48         try:
    49             urlretrieve(url = "https:"+img.get("src"),filename =os.path.join(savefilename,str(cnt)+".jpg"))
    50             cnt+=1
    51         except HTTPError as e:
    52             continue
    53 
    54 if __name__ == "__main__":
    55     mkdir(savepath)
    56     pagenum = 10
    57     for i in range(1,pagenum):
    58         urls = getUrls("https://mm.taobao.com/json/request_top_list.htm"+"?page="+str(i))
    59         pool = ThreadPool(4)
    60         pool.map(getImgs,urls.items())
    61         pool.close()
    62         pool.join()
    63         # for (k,v) in urls.items():
    64         #     getImgs((k,v))

    代码下载地址:

    https://github.com/HaoLiuHust/Spider

    运行结果如下:

     

     

  • 相关阅读:
    MADDPG官方代码实现
    安装moviepy
    单目摄像机测距
    Tensorboard那些事
    instanceof、isPrototype、Object.create的区别
    鼠标事件以及clientX、offsetX、screenX、pageX、x的区别
    JS中的位置和宽度:clientWidth、offsetWidth、scrollWidth等区别
    vue项目build报错的解决办法(ERROR in static/js/vendor.xxxxx.js from UglifyJs)
    onclick(fn)与addEventListener("click", fn)的区别
    第五篇
  • 原文地址:https://www.cnblogs.com/haoliuhust/p/5759339.html
Copyright © 2011-2022 走看看