清明节宅在家里,学爬虫,试着用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. 最后代码
有V1,V2,V3三个版本,V1简单实现了爬取图片,V2实现了单线程爬取全部图片,V3实现了多进程爬取全部图片。V3多进程的实现,应该还存在点小问题,如果各位有什么想法,欢迎私信联系我。