美文网首页大数据 爬虫Python AI Sql
前方Python高能!爬取上万张妹子图!纸巾备好了吗?

前方Python高能!爬取上万张妹子图!纸巾备好了吗?

作者: 14e61d025165 | 来源:发表于2019-03-13 13:37 被阅读0次

    有时候

    只是在人群中多看了一眼

    就再也没办法忘掉那些容颜

    小帅b在普通的一天

    上着普通的网

    不小心打开了一个不太普通的网站

    https://www.mzitu.com/

    从此进入了不普通的一天

    完整代码请加交流群:683380553

    看着不普通的妹纸

    动起了不普通的心思

    这么多妹纸

    不爬取下来

    可惜了

    那么

    接下来就是

    学习 python 的正确姿势

    首先我们来分析一下

    打开这个妹纸的网站首页

    可以看到一共有 211 页

    其中

    每一页有不同妹纸的主图

    再点击进去就是每个妹纸的详情组图

    每一个妹纸的组图中的图片数量不同

    比如其中一个妹纸就有 46 张

    够了

    我们回到首页

    看一下源代码

    可以发现

    每一页的每一个妹纸都被放在 li 标签里面了

    再来

    当我们点击第 2 页的时候

    可以发现 URL 变了

    https://www.mzitu.com/page/2/

    这个我们遇到很多次了

    直接当做变量处理

    所以第一个思路就是拿到每一个页面的所有妹纸的地址

    在这里

    我们可以使用 for 循环来获取每一页的内容

    用 bs4 获取每一个地址然后放到 urls 里面去

    defget_page_urls():foriinrange(1,212):baseurl ='https://www.mzitu.com/page/{}'.format(i)        html = request_page(baseurl)soup = BeautifulSoup(html,'lxml')list = soup.find(class_='postlist').find_all('li')        urls=  []foriteminlist:url =item.find('span').find('a').get('href')            urls.append(url)returnurls

    在这里 212 页太多了

    小帅b来获取一页的数据

    运行一下得到第一页每个妹纸的 URL 

    https://www.mzitu.com/171304https://www.mzitu.com/175090https://www.mzitu.com/171608https://www.mzitu.com/171795https://www.mzitu.com/171041https://www.mzitu.com/175154https://www.mzitu.com/170736https://www.mzitu.com/174947https://www.mzitu.com/174762https://www.mzitu.com/170806https://www.mzitu.com/174433https://www.mzitu.com/174860https://www.mzitu.com/173541https://www.mzitu.com/173063https://www.mzitu.com/173109https://www.mzitu.com/173760https://www.mzitu.com/170563https://www.mzitu.com/170263https://www.mzitu.com/166044https://www.mzitu.com/173721https://www.mzitu.com/168454https://www.mzitu.com/171747https://www.mzitu.com/173845https://www.mzitu.com/173635

    下一步

    拿到每一页的每个妹纸的地址之后

    当然是要从每个地址进去

    获取每个妹纸的所有组图

    遍历一下刚刚获取到的 list

    forurlinlist_page_urls:        download(url)

    那么进入一个妹纸的详情页面的时候

    我们需要获取

    组图的所有图片数量

    组图的名称(真特么sao)

    图片的地址

    知道了这些信息之后

    我们就可以很简单获取了

    defdownload(url):    html= request_page(url)soup = BeautifulSoup(html,'lxml')total = soup.find(class_='pagenavi').find_all('a')[-2].find('span').stringtitle = soup.find('h2').string    image_list = []foriinrange(int(total)):        html= request_page(url +'/%s'% (i +1))soup = BeautifulSoup(html,'lxml')img_url = soup.find('img').get('src')        image_list.append(img_url)    download_Pic(title, image_list)

    在这里我们获取了 total 总页数

    获取到了组图题目 title

    根据总页数进行遍历

    一个页面可以获取到组图中的一张图片

    然后我们把这些图片都放到组图集合中

    接着就可以开始下载了

    我们可以根据这个组图的名字来创建文件夹

    然后将下载的图片放进去

    defdownload_Pic(title, image_list):# 新建文件夹    os.mkdir(title)j =1# 下载图片foriteminimage_list:filename ='%s/%s.jpg'% (title,str(j))print('downloading....%s : NO.%s'% (title,str(j)))withopen(filename,'wb')asf:            img = requests.get(item,headers=header(item)).content            f.write(img)j+=1

    ok

    我们运行一下吧

    可以看到

    每张图片都被我们爬下来了

    名字太他妈引入犯罪

    小帅b不得不打马赛克

    反正你们阅片无数

    心中自然无码

    打开文件夹可以看到

    每一个美女都根据组图生成文件夹

    每个文件夹就是组图里面的图片

    我这马赛克打得是不是很棒?

    但其实

    发现我们在爬的时候

    有点慢了

    还记不记得上次摸鱼提到的多线程?

    python爬虫14 | 就这么说吧,如果你不懂多线程和线程池,那就去河边摸鱼!

    我们来开启多线程试试

    根据我们一开始获取到每个页面的多个妹纸的 URL 来使用线程池

    defdownload_all_images(list_page_urls):# 获取每一个详情妹纸    works = len(list_page_urls)withconcurrent.futures.ThreadPoolExecutor(works)asexector:forurlinlist_page_urls:            exector.submit(download,url)

    这次我们再爬取试试看

    可以看到这次就不是一组一组的爬了

    而是多个线程同时爬取多个组图

    OMG

    我的文件夹

    不行了

    我赶紧删掉

    相关文章

      网友评论

        本文标题:前方Python高能!爬取上万张妹子图!纸巾备好了吗?

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