爬取美少女图片

作者: JxKing | 来源:发表于2016-04-10 13:32 被阅读1652次

清明节宅在家里,学爬虫,试着用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多进程的实现,应该还存在点小问题,如果各位有什么想法,欢迎私信联系我。

相关文章

网友评论

  • 水哥叔叔:您在多线程处的处理对我有所启发,巧了我前几天也写了同样类似的文章,如有兴趣,欢迎探讨
  • ttdevs:哈哈,你可以直接去分析他图片服务器的地址
    JxKing:@ttdevs 有道理!他们命名的方式是有规律的
    ttdevs:@JxKing 别这么死心眼啊。

    base_url = 'http://mm.howkuai.com/wp-content/uploads/%s/%s/%s/%s.jpg'
    def workor():
    for year in range(2011, 2017):
    for month in range(1, 13):
    for day in range(1, 32):
    for index in range(1, 21):
    image_url = base_url % (getYear(year), getIndex(month), getIndex(day), getIndex(index))
    JxKing:@ttdevs 拿到图片服务器地址,拿不到图片的连接,也没用吧

本文标题:爬取美少女图片

本文链接:https://www.haomeiwen.com/subject/nasslttx.html