zoukankan      html  css  js  c++  java
  • Python脚本爬取网站美女照片

    上次无意之中看到一个网站,里面全是美女的照片,我就心想,哪天有时间了得把这网站的所有美女照片都得爬下来。今天有时间,写了点代码,爬去了网站的所有照片。附上战果!图片实在是太多了,爬半个多小时

    先附上所有的源代码:

    # -*- coding: utf-8 -*-
    """
    Created on Fri Nov  9 17:07:44 2018
    @author: 小谢
    """
    import requests
    from bs4 import BeautifulSoup
    import os
    import random
    import csv
    import time
    urls=[]
    urlls=[]
    datas=[]
    i=0
    def Download(name,url,dirname):
        dir=dirname+"//"
        path=os.path.join(dir,name)
        response=requests.get(url)
        try:
            with open(path,"wb") as f:
                f.write(response.content)
                f.close()
                global i
                i=i+1
        except Exception as e:
            print(e)
    #获取每一个分类的URL和名字
    def Geturl():
        resp=requests.get("http://www.27270.com/ent/meinvtupian/")
        resp.encoding="gbk"  #设置网页编码
        html=resp.text
        soup=BeautifulSoup(html,"html.parser")
        divSoup1=soup.find("div",attrs={"id":"NewTagListBox"})
        aas=divSoup1.find_all("a")
        for a in aas:
            tup=(a['href'],a.string)
            urls.append(tup)  #将主页面的各个分栏的链接和名字加入urls元组中
    def GetImages(url,dirname):
        print("*"*50)
        if os.path.exists(dirname):
            pass
        else:
            os.mkdir(dirname)   #创建目录
        try:
            resp=requests.get(url)
            resp.encoding="gbk"  #设置网页编码
            html=resp.text
            soup=BeautifulSoup(html,"html.parser")
            divSoup=soup.find("ul",attrs={'class':'w110 oh Tag_list'})
            lis=divSoup.find_all("li")
            fp=open("meinv.csv","a",newline="")
            csv_writer=csv.writer(fp)
            for li in lis:
                img=li.find("img")
                alt=img['alt']
                name=alt+".jpg"      #图片的名字
                src=img['src']       #图片的下载地址
                tup=(name,src,dirname)
                Download(name,src,dirname)
                csv_writer.writerow(tup)
                print(tup)
                datas.append(tup)            #Download(data[0],data[1],dirname)
            fp.close()
        except Exception as e:
            print(e)
    def GetUrls():
        Geturl()  #获取所有分栏的页面
        for url in urls:
            ur=url[0][:-5]    #将每个分栏的url链接去除最后的 .html
            for i in range(11):
                i+=1
                if i==1:
                    uuu=ur+".html"
                    a=(uuu,url[1])
                    urlls.append(a)
                else:
                    uuu=ur+"_"+str(i)+".html"
                    a=(uuu,url[1])
                    urlls.append(a)
    def main():
        GetUrls()  #获取所有页面的url
        for ur in urlls:
            print(ur[0],ur[1])
            GetImages(ur[0],ur[1])
            time.sleep(3)  #没抓取一个页面延时3秒
    if __name__=='__main__':
        start=time.time()
        main()
        end=time.time()
        print("一共爬去了%s张照片,一共花费了%s的时间"%(str(i),(end-start)))

    网站链接:http://www.27270.com/ent/meinvtupian/

    爬取网站的第一步,就是先分析网站的结构。我们可以看到,上面这里有分类

    我们右键检查元素,发现这些分类都有规律

    我们写一个函数获得每个分类的链接和名字,将链接和名字以元组的形式存储在我们的全局变量 urls中

    def Geturl():
        resp=requests.get("http://www.27270.com/ent/meinvtupian/")
        resp.encoding="gbk"  #设置网页编码
        html=resp.text
        soup=BeautifulSoup(html,"html.parser")
        divSoup1=soup.find("div",attrs={"id":"NewTagListBox"})
        aas=divSoup1.find_all("a")
        for a in aas:
            tup=(a['href'],a.string)
            urls.append(tup)  #将主页面的各个分栏的链接和名字加入urls元组中

    然后我们开始分析每一个分类的规律了,每一个分类都有很多栏,而每一个栏的url都有规律。

    http://www.27270.com/tag/875.html
    http://www.27270.com/tag/875_2.html
    http://www.27270.com/tag/875_3.html
    ......

    所有我们得构造每一个分类的链接,因为每一个分类的栏目数量不同,所以我们选了最多的14。将每一分类的每一页的每张图片的url加入urlls列表中

    def GetUrls():
        Geturl()  #获取所有分栏的页面
        for url in urls:
            ur=url[0][:-5]    #将每个分栏的url链接去除最后的 .html
            for i in range(14):
                i+=1
                if i==1:
                    uuu=ur+".html"
                    a=(uuu,url[1])
                    urlls.append(a)
                else:
                    uuu=ur+"_"+str(i)+".html"
                    a=(uuu,url[1])
                    urlls.append(a)

    接下来的函数是获取图片的URL和名字,

    def GetImages(url,dirname):
        print("*"*50)
        if os.path.exists(dirname):
            pass
        else:
            os.mkdir(dirname)   #创建目录
        try:
            resp=requests.get(url)
            resp.encoding="gbk"  #设置网页编码
            html=resp.text
            soup=BeautifulSoup(html,"html.parser")
            divSoup=soup.find("ul",attrs={'class':'w110 oh Tag_list'})
            lis=divSoup.find_all("li")
            fp=open("meinv.csv","a",newline="")
            csv_writer=csv.writer(fp)
            for li in lis:
                img=li.find("img")
                alt=img['alt']
                name=alt+".jpg"      #图片的名字
                src=img['src']       #图片的下载地址
                tup=(name,src,dirname)   
                Download(name,src,dirname)  #下载图片
                csv_writer.writerow(tup)  #写入文件中
                print(tup)
                datas.append(tup)            #Download(data[0],data[1],dirname)
            fp.close()
        except Exception as e:
            print(e)

    最后这个函数是下载图片

    def Download(name,url,dirname):
        dir=dirname+"//"
        path=os.path.join(dir,name)
        response=requests.get(url)
        try:
            with open(path,"wb") as f:
                f.write(response.content)
                f.close()
                global i
                i=i+1   #每下载一张图片加1
        except Exception as e:
            print(e)
  • 相关阅读:
    "less is more",用"less”命令查看linux文本文件
    Linux命令"ls"进阶说明
    Linux文件权限说明
    Ubuntu14.04安装Ruby2.2方法
    Ubuntu查找软件命令
    Using If/Truth Statements with pandas
    Categorical Data
    DataFrame.loc的区间
    pandas学习(一)
    JDBC编程之事务处理
  • 原文地址:https://www.cnblogs.com/csnd/p/11807802.html
Copyright © 2011-2022 走看看