美文网首页
python爬虫

python爬虫

作者: 无法观测 | 来源:发表于2018-11-10 17:44 被阅读0次

    爬取图片以及遇到的问题

以爬取zol的动漫壁纸为例:

    动漫壁纸数量很大需要用循环来解决,自己下载壁纸的基本过程是

在总网页中选取链接--找到自己要的分辨率--下载及按网页中的名字重命名

分解问题:

    1:在动漫页面中爬取列表中的各个壁纸子网页链接以及“下一页”对应的链接(函数循环访问下一页链接并记录子网页的链接,下一页链接)

2:在子网页连接中获取所需分辨率的链接(注:该链接要链接到一个纯图片的网页以便记录图片的编码)

3将图片编码储存在指定位置

import requests

import re

#引入第三方库

#第一步,获取列表中的子链接以及下一页的链接

def firststep( url ):

#定义函数名firststep,参数url是网址

    pageHtml=requests.get(url)

    #向url发送get请求

    pageHtml.encoding='gb2312'

   # 网页字符编码为gb2312,用encoding指定以gb2312的形式编码pageHtml

    pageText=pageHtml.text

    #记录文本

    list=re.findall(r'<li class="photo-list-padding"><a.*?href="(.*?)".*?target="_blank".*?>',pageText)

#创建list列表用以储存正则表达式检索到的字符,

# .*? 正则的非贪婪匹配 ()捕捉括号里检索的文本到自动命名的组中

#正则的参考:https://www.jb51.net/tools/zhengze.html

    imgList=[] #创建imgList空列表

    for m in list:

        n="http://desk.zol.com.cn"+m

        imgList.append(n)

#for循环将正则捕捉到的文本补充成完整的网址

    try:

        next=re.findall(r'id="pageNext".*?href="(.*?)"',pageText)

        nextUrl=["http://desk.zol.com.cn"+next[0]]

        #这里当写成nextUrl="http://desk.zol.com.cn"+next时是字符串和列表相加会报错,

        #如果写成nextUrl="http://desk.zol.com.cn"+next[0]将返回一个字符串

    except:

        nextUrl=['none']

#尝试捕捉下一页的链接,当下一页链接不存在时nextUrl是一个仅有‘none’的列表

    return imgList,nextUrl

#返回列表中的子链接以及下一页的链接

#第二步:获取图片名,最大分辨率名,和分辨率的链接

def secondStep(imgUrl):

    pageHtml=requests.get(imgUrl)

    pageText=pageHtml.text

    imgName = re.findall(r'id="titleName".*?>(.*?)<', pageText)

    #图片名

    try:

        imgDPI=re.findall(r'href="/showpic/(.*?)',pageText)

        #选出所有分辨率链接(DPI分辨率的简写)

        maxDPI=["http://desk.zol.com.cn/showpic"+imgDPI[0]]

        #最大分辨率为第一个,补全链接

        DPIName=re.findall(r'href="/showpic/.*?" target="_blank">(.*?)</a>',pageText)

        #分辨率名字

        maxDPIName=[DPIName[0]]

        #最大分辨率

    except:

        maxDPI=re.findall(r' .*?id="bigImg" src="(.*?)" ',pageText)

        maxDPIName=["none"]

    #尝试获取最大分辨率及链接 如果不存在则获取图片本身对应的链接

    return imgName,maxDPIName,maxDPI

def thirdstep(imgName,maxDPIName,maxDPI):

    pageHtml=requests.get(maxDPI[0])

    pageContent=pageHtml.content

    #获取图片的字节码(content)

    #text是字符串  ,“text中存的是Beautifulsoup根据猜测的编码方式将content内容编码成字符串”。“而content返回的是bytes型也就是二进制的数据”

    with open ("F:\\IMAGE\\"+imgName[0]+"-"+maxDPIName[0]+".jpg",'wb')as f:

    #将图片保存在F盘的IMAGE文件夹中

    #wb应该是(?)以二进制的形式写入数据

    #当他是w时会显示write() argument must be str, not bytes,write参数必须是STR(字符),而不是字节

        f.write(pageContent)

flag=1

a=b=0

url="http://desk.zol.com.cn/dongman/"

while( flag==1 ):

a=a+1

    b=0

    eveImg,nextUtl=firststep(url)

    for imgUrlin eveImg:

        b=b+1

        imgName, maxDPIName, maxDPI=secondStep(imgUrl)

        thirdstep(imgName, maxDPIName, maxDPI)

        print("第",a,"页","第",b,"个")

        print("success")

url=nextUtl[0]

if( url=="none" ):

    flag=0

print("all success")

相关文章

网友评论

      本文标题:python爬虫

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