刚开学时有一段时间周末没事,于是经常在P站的特辑里收图,但是P站加载图片的速度比较感人,觉得自己身为计算机专业,怎么可以做一张张图慢慢下这么low的事,而且这样效率的确也太低了,于是就想写个程序来帮我下,但是只会C与c++的我看来是无法用他们来做这事的,于是就去学了下简单,强大的python,不得不说,python的模块的确叼,依靠几个模块就可以在完全不知道原理的前提下让程序执行相应功能,这样虽然爽但对于学习不利,我这次就权当写着玩吧,在我学会怎样使用c++来做这事之前我不会再使用python编程了,不过写这个程序过程中我还是知道了一些东西,比如坑爹的编码问题,还有http的一点知识,还有能大概读懂html了,不过,不是通过系统学习,并没有什么卵用。废话不多说,来看代码吧。

from bs4 import BeautifulSoup
import requests
from PIL import Image
from io import BytesIO
import os
import codecs
import sys
headers={
    'Accept':'text/html',
    'Accept-Language':'zh-CN,zh;q=0.8',
    'Referer':"",
    'User-Agent':"此处为浏览器的user-agent"#浏览器数据
}
order=1
def getpic (src,href,mode=""):
     os.system("cls")
     print("共有%d个文件需要下载"%number_of_file)
     if src[-3:] == "gif":
         return'''使用gif来保存静态图片的都是邪教'''
     headers['Referer'] = href
     ispng=False
     url=src.replace("_master1200","")
     url=url.replace(url[20:40],"img-original")
     if mode=='mul':
        print('正在下载第%d个...'%order)
        print("该文件含有多张图:")
     else:
        print('正在下载第%d个...'%order)
     if os.path.exists(file_path+(url.replace('/',""))[-15:]):
         print('已下载第%d个'%order)
         return
     else:
         data=requests.get(url,headers=headers,timeout=60)
     if str(data)!='<Response [200]>':
        ispng=True
        url=url.replace("jpg","png")
     if mode == 'mul':
         if ispng:
             print("********正在下载第1张")
             if os.path.exists(file_path+(url.replace('/',""))[-15:]):
                pass
             else:
                 data=requests.get(url,headers=headers)
                 im=Image.open(BytesIO(data.content))
                 im.save(file_path+(url.replace('/',""))[-15:],'png')
             print("********已下载第1张")
             for i in range(150):
                 url=url.replace("p%d.png"%i,"p%d.png"%(i+1))
                 os.system("cls")
                 print("********正在下载第%d张..."%(i+2))
                 if os.path.exists(file_path+(url.replace('/',""))[-15:]):
                    pass
                 else:
                    data=requests.get(url,headers=headers,timeout=60)
                    if str(data)!='<Response [200]>':
                        break
                    im=Image.open(BytesIO(data.content))
                    im.save(file_path+(url.replace('/',""))[-15:],'png')
                 print("********已下载第%d张"%(i+2))
         else:
             print("********正在下载第1张")
             if os.path.exists(file_path+(url.replace('/',""))[-15:]):
                pass
             else:
                 data=requests.get(url,headers=headers,timeout=60)
                 im=Image.open(BytesIO(data.content))
                 im.save(file_path+(url.replace('/',""))[-15:],'jpeg')
             print("********已下载第1张")
             for i in range(150):
                 url=url.replace("p%d.jpg"%i,"p%d.jpg"%(i+1))
                 os.system("cls")
                 print("********正在下载第%d张..."%(i+2))
                 if os.path.exists(file_path+(url.replace('/',""))[-15:]):
                     pass
                 else:
                     data=requests.get(url,headers=headers,timeout=60)
                     if str(data)!='<Response [200]>':
                         break
                     im=Image.open(BytesIO(data.content))
                     im.save(file_path+(url.replace('/',""))[-15:],'jpeg')
                 print("********已下载第%d张"%(i+2))
     else:
         if ispng :
            if os.path.exists(file_path+(url.replace('/',""))[-15:]):
                print('已下载第%d个'%order)
                return
            else:
                data=requests.get(url,headers=headers,timeout=60)
                if str(data) == '<Response [200]>':
                 im=Image.open(BytesIO(data.content))
                 im.save(file_path+(url.replace('/',""))[-15:],'png')
                print('已下载第%d个'%order)
         else:
            im=Image.open(BytesIO(data.content))
            im.save(file_path+(url.replace('/',""))[-15:],'jpeg')
            print('已下载第%d个'%order)

number=sys.argv[1]
file_path=sys.argv[2]+'\\Picture\\'#修改此处即可改变路径
url_save="http://spotlight.pics/zh/a/%s"%number
wb=requests.get(url_save,headers=headers)
wb_data=BeautifulSoup(wb.text,'lxml')
title=wb_data.h2.string.replace("\n","").replace(":","").replace("?","").replace("\"","").replace(" ","")
title=title.replace("<","").replace(">","").replace("|","").replace("*","").replace("/","").replace("\\","")
#依据windows目录命名规则
file_path=(file_path+title)+"\\"
'''判断文件是否存在'''
if not os.path.exists(file_path):
    introduce=str(wb_data.h2.next_sibling.next_sibling.next_element)
    os.mkdir(file_path)
    f=codecs.open(file_path+"介绍.txt","w","utf-8")
    f.write("特辑号:%s\n"%number+introduce)
    f.close()
divs=wb_data.body.select('div[class="illust-wrap"]')
number_of_file=len(divs)
headers['Accept']='image/webp,image/*,*/*;q=0.8'
for div in divs:
  if str(div.a.parent['class'])!='[\'ugoira-player\', \'ui-scroll-view\']':
    if str(div.a.parent['class'])=='[\'illust-multi-page-wrap\']':
        getpic(div.img['src'],div.a['href'],"mul")
    else:
        getpic(div.img['src'],div.a['href'])
    #要想好动图怎么办
  order+=1

说一下,写程序过程中遇到的问题。

先说主要思路,我们来看一下P站的特辑页面

<div class="illust-wrap">
<a href="http://www.pixiv.net/member_illust.php?mode=medium&amp;illust_id=56543092" class="inner-link" onclick="ga('send', 'event', 'Article', 'ClickIllustImage', 56543092);">
<img src="http://i1.pixiv.net/c/480x960/img-master/img/2016/04/26/15/59/36/56543092_p0_master1200.jpg">
</a>
</div>

这是一个图片url的语句块,可以看到图片的url与图片对应的页面链接,但这个url不是高清图的,高清图的url要在链接对应页面里找,正常来说,我们应该request一下那个链接,请求一下html,再对那个页面中的数据提供的大图url进行request,这才是正规途径,但是,我通过观察大图url发现,只要将小图url的一些地方进行替换就是大图的url,于是我就干脆,试探性地request,只要返回的不是

404,那么说明就是大图的url,那么我们就可以把request返回的数据通过byteio写成图片,就相当于下载了。基本思路就是,寻找预览图对应url---》修改预览图url---》request获得数据---》保存数据为图片。所以,主要的问题就是如何分析网页获取图片url,此外,有一点要说的就是,对于含多张图的url,我采用request到返回404为止的方式,又是一招粗暴的方法,正确方法还是获取网页数据并分析确定图片数目,但是,我一开始不知道可以控制request得到数据的类型,于是觉得少request一下更划算,现在看来真是自作聪明,不过这样对性能的影响是好是坏我不清楚,这主要取决于request不存在的url返回404的速度,后来也懒得改了,因为我发现,速度本来就不乐观,网速好的时候还好,网速差的时候真的是。。。。

然后说一下,写程序过程中遇到的各种bug

问题 1:按特辑保存文件,文件名有可能有unicode字符,而默认的文本保存是gbk,这样就会编码错误。

解决方法:使用codecs已utf-8的编码来写文件。

问题 2:动图的处理。

解决方法:我可以假装看不见(去死吧!),好吧,讲真的,总的来说,特辑里的动图相对而言数量少,我觉得不下没关系,但是如果要下的话,P站那里也没有提供高清图的url,我可以加点代码让他下,但是下不了高清,个人觉得不是高清图的话要他何用?

问题 3:gif图,p站图片大部分格式都是png与jpg这两种主流格式,极少部分是gif,我也是在大量测试(收图)的情况下才发现居然有这种坑。

解决方法:我可以再假装看不见,好吧,讲真的。是因为gif真的很少,我为了解决这个bug就得多加一个判断,这样我觉得得不偿失,(这主要是我不访问链接页面获取url数据留下的锅),于是就拒绝下gif,另一个就是无论如何我都很难接受不是动图却使用gif的事实。。。

问题 4: header 的制定。

解决方法:一开始不知道,怎样也request不到图片,傻傻地加了cookie也没用,后来才发现只要user—agent与referer就好了,另外,默认的文字是英文,要加上language才能得到中文标题。

问题 5:windows目录名问题

解决方法:将所有标题中的非法字符去掉,这个真的没办法,这是微软的锅,就算会让标题看起来显得奇怪我也只能去掉。

以上就是所有编程过程中的问题了,最后解释一下这段代码,写这段代码的过程我是使用python3.5来作为解释器,这段代码的功能是接受两个参数,特辑号与保存路径。他就会在路径下创建一个目录名为特辑标题的文件夹,然后将专辑中的所有非动图与gif下载到文件夹中,因为我没有队列开多线程优化(我也不会的说),所有速度比较感人。还有值得一提的是,路径中必须有名为Picture的文件夹,所有特辑都会保存在其中,我觉得这种事不用交给程序,于是就没写进去。

其实这段代码能有效运行,主要功劳都属于beautifulsoup与request这两个功能强大,封装性好的模块(也许太好了,以至于我根本不清楚它的原理,有点小郁闷)。

此外,有了以上那个getpic函数,我们通过分析页面,就可以下载P站各个模块的图。P站具有标签功能与图片的热度显示,对标签较好的维护,使得海量图片有效的组织,图片的热度可以看作图片质量的衡量指标,这也许能看作P站的一个卖点,至少,它自己的确是把这看作是一个卖点,收费20RMP一个月就可以支持按热度搜索标签内容,但我穷,只能写程序来偷偷拥有这个功能,其实,有了getpic,这就不是难事了,但问题是,只有注册用户在登陆后才看到到热度,也就是,要在header中加上注册用户的cookie,一开始不知道,还以为是各种动态脚本生成的加密算法之类的,结果我还是高估了P站程序员的良心。嗯,顺便也贴写代码吧。

from bs4 import BeautifulSoup
from PIL import  Image
import  os
import requests
from io import BytesIO
import sys
headers={
    'Accept':'',
    'Accept-Language':'zh-CN,zh;q=0.8',
    'Referer':"",
    'User-Agent':"浏览器user——agent",#浏览器数据
    'Cookie':""
}
cookies=""#此处填入注册用户的cookies
def getpic (src,href,mode=""):
     if src[-3:] == "gif":
         return'''使用gif来保存静态图片的都是邪教'''
     headers['Referer'] = href
     ispng=False
     url=src.replace("_master1200","")
     url=url.replace(url[20:40],"img-original")
     if mode=='mul':
        print("该文件含有多张图:")
     else:
        print('正在下载...')
     if os.path.exists(file_path+(url.replace('/',""))[-15:]):
         print('下载完成')
         return
     else:
         data=requests.get(url,headers=headers,timeout=60)
     if str(data)!='<Response [200]>':
        ispng=True
        url=url.replace("jpg","png")
     if mode == 'mul':
         if ispng:
             print("********正在下载第1张")
             if os.path.exists(file_path+(url.replace('/',""))[-15:]):
                pass
             else:
                 data=requests.get(url,headers=headers,timeout=60)
                 if str(data) == '<Response [200]>':
                  im=Image.open(BytesIO(data.content))
                  im.save(file_path+(url.replace('/',""))[-15:],'png')
             print("********已下载第1张")
             for i in range(150):
                 url=url.replace("p%d.png"%i,"p%d.png"%(i+1))
                 os.system("cls")
                 print('正在下载第%d页...'%page)
                 print("********正在下载第%d张..."%(i+2))
                 if os.path.exists(file_path+(url.replace('/',""))[-15:]):
                    pass
                 else:
                    data=requests.get(url,headers=headers,timeout=60)
                    if str(data)!='<Response [200]>':
                        break
                    im=Image.open(BytesIO(data.content))
                    im.save(file_path+(url.replace('/',""))[-15:],'png')
                 print("********已下载第%d张"%(i+2))
         else:
             print("********正在下载第1张")
             if os.path.exists(file_path+(url.replace('/',""))[-15:]):
                pass
             else:
                 data=requests.get(url,headers=headers,timeout=60)
                 im=Image.open(BytesIO(data.content))
                 im.save(file_path+(url.replace('/',""))[-15:],'jpeg')
             print("********已下载第1张")
             for i in range(150):
                 url=url.replace("p%d.jpg"%i,"p%d.jpg"%(i+1))
                 os.system("cls")
                 print('正在下载第%d页...'%page)
                 print("********正在下载第%d张..."%(i+2))
                 if os.path.exists(file_path+(url.replace('/',""))[-15:]):
                     pass
                 else:
                     data=requests.get(url,headers=headers,timeout=60)
                     if str(data)!='<Response [200]>':
                         break
                     im=Image.open(BytesIO(data.content))
                     im.save(file_path+(url.replace('/',""))[-15:],'jpeg')
                 print("********已下载第%d张"%(i+2))
     else:
         if ispng :
            if os.path.exists(file_path+(url.replace('/',""))[-15:]):
                print('下载完成')
                return
            else:
                data=requests.get(url,headers=headers,timeout=60)
                if str(data) == '<Response [200]>':
                 im=Image.open(BytesIO(data.content))
                 im.save(file_path+(url.replace('/',""))[-15:],'png')
                print('下载完成')
         else:
            im=Image.open(BytesIO(data.content))
            im.save(file_path+(url.replace('/',""))[-15:],'jpeg')
            print('下载完成')
tag=sys.argv[1]
hot=int(sys.argv[2])
file_path=sys.argv[3]+'\\Tag\\'#修改此处即可改变路径
title=tag.replace("\n","").replace(":","").replace("?","").replace("\"","").replace(" ","")
title=title.replace("<","").replace(">","").replace("|","").replace("*","").replace("/","").replace("\\","")
#依据windows目录命名规则
file_path=(file_path+title+str(hot))+"\\"
if not os.path.exists(file_path):
    os.mkdir(file_path)
if not os.path.exists(file_path+'begin'):
    f=open(file_path+'begin',"w")
    f.write(')
    f.close()
f=open(file_path+'begin',"r")
begin=int(f.read())
for page in range(begin,1001):
    url_save="http://www.pixiv.net/search.php?word=%s&s_mode=s_tag_full&order=date_d&type=illust&p=%d"%(tag,page)
    headers['Referer']=""
    headers['Cookie'] = cookies
    headers['Accept'] = "text/html"
    wb=requests.get(url_save,headers=headers)
    wb_data=BeautifulSoup(wb.text,'lxml')
    lis=wb_data.body.select('li[class="image-item"]')
    if len(lis) == 0:
        break
    f=open(file_path+'begin',"w")
    f.write(str(page))
    f.close()
    headers['Cookie']=""
    headers['Accept']='image/webp,image/*,*/*;q=0.8'
    os.system("cls")
    print('正在下载第%d页...'%page)
    for li in lis:
        if str(li.ul)!='None':
            if int(li.ul.i.next_sibling)>=hot:
                os.system("cls")
                print('正在下载第%d页...'%page)
                if li.a['class'][2]=='multiple':
                   getpic(li.img['src'],'http://www.pixiv.net'+li.a['href'],'mul')
                else:
                   getpic(li.img['src'],'http://www.pixiv.net'+li.a['href'])

这个和上面那个差不多,接受三个参数,标签名,热度(数字),路径,就可以保存图片到路径下,名为标签+热度的文件夹里了,下载速度一般不乐观,主要取决于热度,热度越大,速度越快。

因为不是多线程下载,所有速度不乐观,而且这两段代码我都设定了60秒的request超时限制,所以有可能出现代码动不动就崩溃的现象,一般来说这时只要继续重新运行就好,但是手动点好麻烦,于是,我就写了两个windowsbat来作为程序接口调用他们。通过接受返回码来确定下载是否完成,没完成的话就重新调用程序,所以说脚本真是解放生产力啊,但是还有一个问题,就是程序要支持断点续传,对特辑而言,页面的请求只有一次,且图片数量少,于是只要在下载request每张图之前判断图片是否存在就好,(因为主要时间都消耗在了request和图片写入上,特别是前者),但是对于tag的下载,request页面就不止一次,于是很有必要保存最后一次下载页面的页数。

这是两个脚本

特辑:

@echo off
if not exist Picture md Picture
echo 请选择
 : 打开每日特辑
 : 输入特辑号
set /p choose=
 goto else
start http://spotlight.pics/zh
:else
echo 请输入特辑号
set /p number=
:excuteagain
cls
python getpic.py %number% %cd%
 goto excuteagain
echo 是否继续下载?输入‘c’继续或输入‘q’退出
set/p continue=
cls
if not %continue%==q goto else

标签:

@echo off
if not exist Tag md Tag
echo 请输入标签
set /p tag=
echo 请输入热度(数字)
set /p hot=
:loop
python Tag.py %tag% %hot% %cd%
 goto loop
del F:\Tag\%tag%%hot%\begin  

嗯,以上就是全部了,最后说一下,python真的是一门不错的语言,简单,强大,易懂,完美地体现脚本语言的魅力,我觉得非计算机人员比如所各个高校的非计算机专业学生,在学编程时不应该学c,打击积极性,而且学了就忘,应该学python才对。

===============================7月份,P站更新,顺便更新============================================

放弃了原来那种request看是不是404的坑爹方式,查找图片特面链接,用一个函数getpic(link,path,timeout=60)去下载图片,当然,要配合request头使用,但

通用性比原来好多了,吃饱了没事也许会用它写下爬国际排行榜的程序。

#爬取pivision图片,传给程序一个整数参数代表特辑号,保存图片+描述
from bs4 import BeautifulSoup
import requests
from PIL import Image
from io import BytesIO
import os
import codecs
import sys
headers={
    'Accept':'text/html',
    'Accept-Language':'zh-CN,zh;q=0.8',
    'Referer':"",
    'User-Agent':"",
    'Cookie':""
}
def getsavebackname(file_name):#jpg格式保存后缀需为jpeg
    res=""
    for i in range(0,len(file_name)):
           if file_name[-i]=='.':
               res=file_name[-i+1:]
               break
    if res!="jpg":
        return res
    else:
        return 'jpeg'
def getbackname(file_name):
    for i in range(0,len(file_name)):
           if file_name[-i]=='.':
               return file_name[-i+1:]
def getsavename(file_name):
    for i in range(0,len(file_name)):
           if file_name[-i:-i+3]=='img':
               return file_name[-i+4:].replace("/","_")
def getpic(url,path,timeout=60):#无法处理动图,等到见到时再分析设计吧
    headers['Accept']='text/html'
    headers['Referer']=url
    wb=requests.get(url,headers=headers,timeout=timeout)
    wb_data=BeautifulSoup(wb.text,'lxml')
    res={'ismul':False,'number_download':0}
    work_display=wb_data.body.select('div[class="works_display"]')
    if work_display[0].div['class']==['_layout-thumbnail','ui-modal-trigger']:#单张
       headers['Accept']='image/webp,image/*,*/*;q=0.8'
       hidden=wb_data.body.select('img[class="original-image"]')
       if os.path.exists(path+getsavename(hidden[0]['data-src'])):
            pass
       else:
            img_data=requests.get(hidden[0]['data-src'],headers=headers,timeout=timeout)
            img=Image.open(BytesIO(img_data.content))
            img.save(path+getsavename(hidden[0]['data-src']),getsavebackname(hidden[0]['data-src']))
       res['number_download']+=1
    else:
        if work_display[0].div['class']==['_layout-thumbnail']:#以下假设套图内所有文件格式相同,当然,不排除作者脑残,但这样的作者根据进化论应该不存在
            res['ismul']=True
            url=url.replace('medium','manga_big')
            url+='&page=0'
            manga_big=requests.get(url,headers=headers,timeout=timeout)
            manga_big_data=BeautifulSoup(manga_big.text,'lxml')
            backname=getbackname(manga_big_data.body.img['src'])
            savebackname=getsavebackname(manga_big_data.body.img['src'])
            front_link=manga_big_data.body.img['src'].replace("0."+backname,"")
            front_save_name=getsavename(front_link)
            headers['Accept']='image/webp,image/*,*/*;q=0.8'
            for i in range(0,1000):#我不信比这个还多
                if os.path.exists(path+getsavename(front_link+str(i)+'.'+backname)):
                    pass
                else:
                    img_data=requests.get(front_link+str(i)+'.'+backname,headers=headers,timeout=timeout)
                    if str(img_data)!='<Response [200]>':
                       break
                    img=Image.open(BytesIO(img_data.content))
                    img.save(path+front_save_name+str(i)+'.'+backname,savebackname)
                res['number_download']+=1
        else:
            pass#动图不要了
    return res

number=sys.argv[1];
file_path="F:\\Pictures\\"
url_save="http://www.pixivision.net/zh/a/%s"%number
wb=requests.get(url_save,headers=headers)
wb_data=BeautifulSoup(wb.text,'lxml')
title=wb_data.head.title.string.replace("\n","").replace(":","").replace("?","").replace("\"","").replace(" ","")
title=title.replace("<","").replace(">","").replace("|","").replace("*","").replace("/","").replace("\\","")
#依据windows目录命名规则
file_path=(file_path+title)+"\\"
#判断文件是否存在
if not os.path.exists(file_path):
    description=wb_data.head.select('meta[property="twitter:description"]')
    os.mkdir(file_path)
    f=codecs.open(file_path+"介绍.txt","w","utf-8")
    f.write("特辑号:%s"%number+'\r\n'+str(description[0]['content']))
    f.close()
urls=wb_data.body.select('a[class="inner-link"]')
number_of_file=len(urls)/2-1
headers['Accept']='image/webp,image/*,*/*;q=0.8'
print("共有 %d 张图片要下载"%number_of_file)
order=1
for url in urls:
    if str(url.img) == "None" and len(url['href'])>len("http://www.pixiv.net/member.php?id=********"):
        print("正在下载第 %d 张......"%order)
        getpic(url['href'],file_path)
        order+=1
#爬取标签下某热度图片,传标签名,热度(正整数),保存图片
from bs4 import BeautifulSoup
import requests
from PIL import Image
from io import BytesIO
import os
import codecs
import sys
headers={
    'Accept':'text/html',
    'Accept-Language':'zh-CN,zh;q=0.8',
    'Referer':"",
    'User-Agent':"",
    'Cookie':""
}
def getsavebackname(file_name):#jpg格式保存后缀需为jpeg
    res=""
    for i in range(0,len(file_name)):
           if file_name[-i]=='.':
               res=file_name[-i+1:]
               break
    if res!="jpg":
        return res
    else:
        return 'jpeg'
def getbackname(file_name):
    for i in range(0,len(file_name)):
           if file_name[-i]=='.':
               return file_name[-i+1:]
def getsavename(file_name):
    for i in range(0,len(file_name)):
           if file_name[-i:-i+3]=='img':
               return file_name[-i+4:].replace("/","_")
def getpic(url,path,timeout=60):#无法处理动图,等到见到时再分析设计吧
    headers['Accept']='text/html'
    headers['Referer']=url
    wb=requests.get(url,headers=headers,timeout=timeout)
    wb_data=BeautifulSoup(wb.text,'lxml')
    res={'ismul':False,'number_download':0}
    work_display=wb_data.body.select('div[class="works_display"]')
    if work_display[0].div['class']==['_layout-thumbnail','ui-modal-trigger']:#单张
       headers['Accept']='image/webp,image/*,*/*;q=0.8'
       hidden=wb_data.body.select('img[class="original-image"]')
       if os.path.exists(path+getsavename(hidden[0]['data-src'])):
            pass
       else:
            img_data=requests.get(hidden[0]['data-src'],headers=headers,timeout=timeout)
            img=Image.open(BytesIO(img_data.content))
            img.save(path+getsavename(hidden[0]['data-src']),getsavebackname(hidden[0]['data-src']))
       res['number_download']+=1
    else:
        if work_display[0].div['class']==['_layout-thumbnail']:#以下假设套图内所有文件格式相同,当然,不排除作者脑残,但这样的作者根据进化论应该不存在
            res['ismul']=True
            url=url.replace('medium','manga_big')
            url+='&page=0'
            manga_big=requests.get(url,headers=headers,timeout=timeout)
            manga_big_data=BeautifulSoup(manga_big.text,'lxml')
            backname=getbackname(manga_big_data.body.img['src'])
            savebackname=getsavebackname(manga_big_data.body.img['src'])
            front_link=manga_big_data.body.img['src'].replace("0."+backname,"")
            front_save_name=getsavename(front_link)
            headers['Accept']='image/webp,image/*,*/*;q=0.8'
            for i in range(0,1000):#我不信比这个还多
                if os.path.exists(path+getsavename(front_link+str(i)+'.'+backname)):
                    pass
                else:
                    img_data=requests.get(front_link+str(i)+'.'+backname,headers=headers,timeout=timeout)
                    if str(img_data)!='<Response [200]>':
                       break
                    img=Image.open(BytesIO(img_data.content))
                    img.save(path+front_save_name+str(i)+'.'+backname,savebackname)
                res['number_download']+=1
        else:
            pass#动图不要了
    return res

tag=sys.argv[1]
hot=int(sys.argv[2])
file_path="F:\\Tag\\"
title=tag.replace("\n","").replace(":","").replace("?","").replace("\"","").replace(" ","")
title=title.replace("<","").replace(">","").replace("|","").replace("*","").replace("/","").replace("\\","")
#依据windows目录命名规则
file_path=(file_path+title+str(hot))+"\\"
if not os.path.exists(file_path):
    os.mkdir(file_path)
if not os.path.exists(file_path+'begin'):
    f=open(file_path+'begin',"w")
    f.write(')
    f.close()
f=open(file_path+'begin',"r")
begin=int(f.read())
for page in range(begin,1001):
    url_save="http://www.pixiv.net/search.php?word=%s&s_mode=s_tag_full&order=date_d&type=illust&p=%d"%(tag,page)
    headers['Accept'] = "text/html"
    wb=requests.get(url_save,headers=headers)
    wb_data=BeautifulSoup(wb.text,'lxml')
    lis=wb_data.body.select('li[class="image-item"]')
    if len(lis) == 0:
        break
    f=open(file_path+'begin',"w")
    f.write(str(page))
    f.close()
    headers['Accept']='image/webp,image/*,*/*;q=0.8'
    os.system("cls")
    print('正在下载第%d页...'%page)
    for li in lis:
        if str(li.ul)!='None':
            if int(li.ul.i.next_sibling)>=hot:
                os.system("cls")
                print('正在下载第%d页...'%page)
                getpic("http://www.pixiv.net"+li.a['href'],file_path)

使用python爬取P站图片的更多相关文章

  1. 萌新学习Python爬取B站弹幕+R语言分词demo说明

    代码地址如下:http://www.demodashi.com/demo/11578.html 一.写在前面 之前在简书首页看到了Python爬虫的介绍,于是就想着爬取B站弹幕并绘制词云,因此有了这样 ...

  2. 用Python爬取B站、腾讯视频、爱奇艺和芒果TV视频弹幕!

    众所周知,弹幕,即在网络上观看视频时弹出的评论性字幕.不知道大家看视频的时候会不会点开弹幕,于我而言,弹幕是视频内容的良好补充,是一个组织良好的评论序列.通过分析弹幕,我们可以快速洞察广大观众对于视频 ...

  3. python爬取某站上海租房图片

    前言 对于一个net开发这爬虫真真的以前没有写过.这段时间开始学习python爬虫,今天周末无聊写了一段代码爬取上海租房图片,其实很简短就是利用爬虫的第三方库Requests与BeautifulSou ...

  4. python爬取某站新闻,并分析最近新闻关键词

    在爬取某站时并做简单分析时,遇到如下问题和大家分享,避免犯错: 一丶网站的path为 /info/1013/13930.htm ,其中13930为不同新闻的 ID 值,但是这个数虽然为升序,但是没有任 ...

  5. 用python爬取B站在线用户人数

    最近在自学Python爬虫,所以想练一下手,用python来爬取B站在线人数,应该可以拿来小小分析一下 设计思路 首先查看网页源代码,找到相应的html,然后利用各种工具(BeautifulSoup或 ...

  6. Python爬取B站耗子尾汁、不讲武德出处的视频弹幕

    本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理. 前言 耗子喂汁是什么意思什么梗呢?可能很多人不知道,这个梗是出自马保国,经常上网的人可能听说过这个 ...

  7. Python爬取B站视频信息

    该文内容已失效,现已实现scrapy+scrapy-splash来爬取该网站视频及用户信息,由于B站的反爬封IP,以及网上的免费代理IP绝大部分失效,无法实现一个可靠的IP代理池,免费代理网站又是各种 ...

  8. python爬取b站排行榜

    爬取b站排行榜并存到mysql中 目的 b站是我平时看得最多的一个网站,最近接到了一个爬虫的课设.首先要选择一个网站,并对其进行爬取,最后将该网站的数据存储并使其可视化. 网站的结构 目标网站:bil ...

  9. Python爬取b站任意up主所有视频弹幕

    爬取b站弹幕并不困难.要得到up主所有视频弹幕,我们首先进入up主视频页面,即https://space.bilibili.com/id号/video这个页面.按F12打开开发者菜单,刷新一下,在ne ...

随机推荐

  1. ASP.NET错误页

    当页面发生错误的时候,ASP.Net会将错误信息展示出来,这样一来不好看,二来会泄露网站的内部实现信息,给网站带来安全隐患,因此需要定制错误页,发生错误时显示开发人员定制的页面404页面放点广告也是好 ...

  2. MIS框架开发计划

    计划开发模块 缓存模块 全球化模块(时间转换.货币转换.语言切换.度量转换.时区转换) 用户模块 用户短消息模块 日志模块(系统日志.用户操作日志.安全审计日志) 权限模块 配置模块 事件模块(观察者 ...

  3. 上传文件到服务器端后进一步推送到sftp服务器

    扩展安装 要想sftp服务端发送文件,就需要php脚本具有作为ssh客户端的能力,所以需先为php安装如下扩展 openssl openssl-dev libssh php ssh 扩展 按照下面的命 ...

  4. bzoj4038: 医疗援助

    Description 一只带着先进设备和药物的医疗团队来到了埃博拉病毒疫区的某个非洲国家.这个国家有n个村庄,均坐落在该国唯一的一条公路旁,n个村庄依次标号为1,2,…n.第i个村庄有a_i个埃博拉 ...

  5. 配置Apache服务器 数据库mySQL

    Mac 配置  apache   php 详细解说 一.开启apache 并切改变引导 1.打开终端  输入:sudo apachectl start    回车,关闭终端 2.打开浏览器,地址栏输入 ...

  6. nginx 多站点配置方法

    关于nginx的多站设置,其实和apache很相似哒. 假设我们已经有两个域名,分别是:www.websuitA.com和www.websuitB.com.并且这两个域名已经映射给了IP为192.16 ...

  7. 从小白进阶ubuntu高手的必经之路—命令

    精选的十二个ubuntu下的命令,熟记于心,则能甩掉ubuntu小白标签,高手的伟岸形象焕然生发.一.管理员权限绝大部分情况下,命令的行为须要被赋予管理员权限才能执行.命令 sudo 作用:赋予当前命 ...

  8. EZ-USB FX2(68013)固件研究

    原始资料来自网络 整理日: 2015年2月12日 1. Welcome 算是给所有正在学习USB,还徘徊着不得其门而入的朋友一个入门的契机吧,我也深知入门的痛苦,有些人入门就是抱着那什么USB协议,包 ...

  9. ajax 同步异步调用

  10. 【技术贴】三星Note8 N5100实用教程,关闭相机快门声,增加浏览器退出按钮。

    需要root 增加快门声按钮: 在\system\csc\目录下,有个others.xml的手机功能定制文件,用root explorer之类可以修改系统文件权限的文本修改工具编辑它,在文件最末添加这 ...