zoukankan      html  css  js  c++  java
  • 美图录爬虫(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)
    
        
    
  • 相关阅读:
    使用cordova,监听安卓机物理返回按键,实现退出程序的功能
    使用cordova network-information 插件监听手机网络状态
    使用cordova,使html5也能像IOS,Android那样可以 调取手机的相机拍照功能
    使用canvas给图片添加水印, canvas转换base64,,canvas,图片,base64等转换成二进制文档流的方法,并将合成的图片上传到服务器,
    phpStudy的安装和配置
    小程序入坑(一)---如何引入iconfont 字体图标
    HTML5 原生API input file 来实现多图上传,并大图预览
    webpack引入全局jQuery
    前端滑动分页获取数据(jQuery)
    开源蚂蚁笔记自建服务器
  • 原文地址:https://www.cnblogs.com/WXGC-yang/p/10522299.html
Copyright © 2011-2022 走看看