• 美图录爬虫(requests模块,re模块)


    Python

    爬虫

    最近学正则表达式,刚好知道这个网站美图录,就做了个爬虫拿来练练手,说一说遇到的问题

    一 404问题

    问题:

    由于图片显示页面是分页的,每一页展示5张图片,为了方便没有每次去获取下一页链接,而是使用了拼接字符串的形式,本以为遇到不存在的页面会抛出异常,测试了下,结果当网站遇到404时会直接跳转推荐页,于是requests还能正常返回数据

    解决方法:

    requests提供了一个req_object.status_code参数,用于返回页面状态码,判断一下这个参数为404就停止生成链接

    二 文件写入问题

    问题:

    写入图片文件,图片无法正常显示

    解决方法:

    requests提供了img.content参数,用于将接受到的信息转换为二进制,然后在文件写入时,写入模式为"wb",以二进制方式写入

    三反爬策略

    问题:

    爬取图片时发现图片会返回403(禁止访问资源),原因是网站做了防盗链处理,非本站访问图片都会返回403

    解决方法:

    在获取图片时添加headers请求头,在请求头中添加

    'Referer':'https://m.meitulu.com/item/1.html'
    将Referer 值设置为本站的图片展示页链接,这样服务器会认为请求来自本站页面,返回信息就会正常

    美图录爬虫

    # -*- coding: utf-8 -*-
    import requests
    import re
    import os
    
    def url_ls(url):
        #获取页面所有套图链接
        html=requests.get(url)
        html.encoding=html.apparent_encoding
        url_ls=re.findall("https://m.meitulu.com/item/w+",html.text)
        return url_ls
    
    
    def tup(url):
        #获取图片链接及套图名
        url_ls=[]
        num=1
        name=""
        while True:
            if num==1:
                url1=url+".html"
                num+=1
                print(name)
            else:
                url1=url+"_{}.html".format(num)
                num+=1
            print(url1)
            a=requests.get(url1)
            if a.status_code==404:
                break
            a.encoding=a.apparent_encoding
            my_url=re.findall("https://mtl.ttsqgs.com/images/img/w+/w+.jpg",a.text)
            if name=="":
                na=re.findall("<h1>[wW]+</h1>",a.text)
                nam=re.sub("<h1>","",na[0])
                name=re.sub("</h1>","",nam)
                print(name)
            for i in my_url:
                if "/0.jpg" not in i:
                    url_ls.append(i)
        return url_ls,name
    
    def w(url,name,num):
        headers={
    'Host':'mtl.ttsqgs.com',
    'Connection':'keep-alive',
    'User-Agent':'Mozilla/5.0 (Linux; Android 7.1.2; M6 Note) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.105 Mobile Safari/537.36',
    'Accept':'image/webp,image/apng,image/*,*/*;q=0.8',
    'Referer':'https://m.meitulu.com/item/1.html',
    'Accept-Encoding':'gzip, deflate, br',
    'Accept-Language':'zh-CN,zh;q=0.9'
    }
        name=re.sub('[/:*?"<>|]',"_",name)
        print(name)
        print("正在下载{}".format(name))
        img=requests.get(url,headers=headers)
        os.system("clear")
        imga=img.content
        with open("./{}/{}.jpg".format(name,num),"wb") as f:
            print("正在写入{}".format(num))
            f.write(imga)
            f.close()
        
    url=input("url")
    urllist=url_ls(url)
    for i in set(urllist):
        tup_ls,name=tup(i)
        os.makedirs("./{}".format(name))
        n=0
        for j in tup_ls:
            n+=1
            num='{:0>4}'.format(n)
            w(j,name,num)
    
        
    
  • 相关阅读:
    [原]Eclipse 安装SVN、Maven插件(补充)
    [原]几个云笔记的简单比较
    [原]Unity3d中奇怪的编译错误
    [原]unity中WWW isDone方法只能在主线程中调用
    C语言。格式化符号
    Unity iOS Guideline 1.3
    AR增强现实 之Metaio For Unity 开发 之HelloWorld
    Unity 4.6 bate 20 or 4.5.5 +vuforia3.0.9 发布到真机错误 解决
    服务器端Ajax异步分页类,基本通用分页类
    从数据库中读取数据并写入到Excle电子表格之2
  • 原文地址:https://www.cnblogs.com/WXGC-yang/p/10522299.html
Copyright © 2020-2023  润新知