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

运行结果如下:

 

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM