爬取美少女图片

608 查看

清明节宅在家里,学爬虫,试着用python爬取www.meizitu.com这个网站中的美少女图片。用了python3以及requests,BeautifulSoup,multiprocessing这些包。

1.尝试分析,得到图片url

首先打开该网站,点击右键,查看网页源代码。或者通过requests查看首页内容。


import requests

from bs4 import BeautifulSoup

url='www.meizitu.com'

response=requests.get(url)

soup=BeautifulSoup(response.content,'lxml')

分析soup,我们看到其中有图片的连接,还有连接到其他网页的url,通过BeautifulSoup得到他们(BeautifulSoup的介绍,请看Beautiful Soup 4.2.0 文档

webs=soup.find_all('a',target='_blank')

此时webs类似list,能通过index来调用其中的元素,而每一个元素都类似字典

webs[0]['href']#得到url

而经过分析,我们知道,图片的url能通过类似方法获得

soup.find_all('img')[0]['src']

2.尝试保存图片

photoUrl='http://pic.meizitu.com/wp-content/uploads/2016a/02/26/01.jpg'

photo = requests.get(pict_url)

with open(,'wb') as newfile:  #图片输出

    newfile.write(picture.content)

另外我们发现所以图片的url都是统一的命名格式,所以我们可以通过拆解图片的url提取字符串作为图片名称

photoStoreName=photoUrl.split('uploads')[1]


保存图片

with open(photoStoreName,'wb') as newfile:  #图片输出

     newfile.write(photo.content)

3.整体框架

用伪代码将整个爬虫框架BFS介绍下:

stack=deque() #deque来自collections这个包,将还没爬过的url加入其中

nameSet=set()  #将保存过的图片加入其中

visited=set() #将已经爬过的网页url加入其中

while stack: 

    url=stack.popleft()

    response =requests.get(url)

    visited.add(url)

    soup= BeautifulSoup(response.content,'lxml')

    分析soup,得到网页url还有图片,如果网页url不在visited中,则加入stack;如果图片的名称不在nameSet中,则保存图片,并将该名字加入nameSet

4.多进程

前三步其实已经可以爬取图片了,但是图片非常多(我自己由于网速限制,没爬完,只爬了6000多张,已经营养不良了),所以采取多进程的方法来爬。python的multiprocessing的pool,非常好用。

5. 最后代码

GitHub - jinxin0924/Crawler

有V1,V2,V3三个版本,V1简单实现了爬取图片,V2实现了单线程爬取全部图片,V3实现了多进程爬取全部图片。V3多进程的实现,应该还存在点小问题,如果各位有什么想法,欢迎私信联系我。