• 优美库图片系统


    今天制作一个优美库图片小程序,网址http://www.umei.cc/bizhitupian/

    爬虫的相关流程:获取目标网址-获取数据-存储数据。下面是该网页的内容:

    第一步:找到该网站下的便签,找到该标签网页下所有的url,这里的思路是获取该标签下的页数,通过循环拼接所有的url。

    对电脑壁纸标签下的网页1(<http://www.umei.cc/bizhitupian/diannaobizhi/1.htm>)与网页2(<http://www.umei.cc/bizhitupian/diannaobizhi/2.htm>)进行比较,你会发现只是url中的数字发生改变,所以我们可以模拟构造url,进行图片链接的抓取。

    代码段:

     1 import  requests
     2 from lxml import  etree
     3 import  re
     4 from urllib.request import urlretrieve
     5 import  random
     6 dict = {}
     7 img_url = []
     8 img = []
     9 10 headers = {
    11 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36'
    12 }
    13 def Total_label():
    14     '''获取标签并进行分类存放在字典中'''
    15     response = requests.get('http://www.umei.cc/bizhitupian/').content
    16     html = etree.HTML(response)
    17 18     title = html.xpath("//div[@class='w850 l oh']//a/@title")
    19     url = html.xpath("//div[@class='w850 l oh']//a/@href")
    20     # 循环镶嵌将标题与url结合
    21     index = 0
    22     for i in title:
    23         dict[i] = url[index]
    24         index += 1
    25 # for k, v in dict.items():
    26 #     print(k , v)
    27 # 抓取链接
    28 def Grab(num):
    29     '''获取每个标签下的总页数'''
    30     url = dict[num]
    31     # print(url)
    32     response = requests.get(url,headers=headers,timeout=3)
    33     # response.encoding = 'utf-8'
    34     text = response.content.decode('utf-8')
    35     html = etree.HTML(text)
    36     pages = html.xpath("//div[@class='NewPages']//ul/li//@href")[-1].split('.')[0]
    37     return (int(pages),url)
    38 39 # 获取总页中所有分页的url
    40 def get_paging(url,pages_n):
    41     urls = [url+'{}.htm'.format(i) for i in range(1,pages_n+1)]
    42     '''获取每个url下的图片链接'''
    43     for i in urls:
    44         response_time = requests.get(i, headers=headers, timeout=3)
    45         # response.encoding = 'utf-8'
    46         text = response_time.content.decode('utf-8')
    47         html = etree.HTML(text)
    48         jpg_url = html.xpath("//div[@class='TypeList']//a/@href")
    49         for i in jpg_url:
    50             img_url.append(i)

    第二步:我们已经有了分页的url,我们再获取图片的url,进行下载即可:

     1 def img_To_obtain():
     2     '''图片获取'''
     3     # 图片链接 Xpath语法://*[@id="ArticleId60"]/p/a/img/@src
     4     # print(img_url)
     5     for x in img_url:
     6         response = requests.get(x,headers=headers,timeout=3)
     7         text = response.content.decode('utf-8')
     8         html = etree.HTML(text)
     9         '''整站爬,分页,可以通过url进行判断
    10         if 页数2 == 网页状态404:
    11             只是一张图片
    12         该系列有分页
    13         '''
    14         page_f = html.xpath('//*[@id="ArticleId60"]/p/a/img/@src')
    15         for j in page_f:
    16             img.append(j)
    17 18 def extract():
    19     '''随机获取一张图片'''
    20     IMAGE_URL = random.choice(img)
    21     The_suffix = IMAGE_URL.split('.')[3]
    22     urlretrieve(IMAGE_URL, './image/img1.{}'.format(The_suffix))

    主程序部分:

     1 if __name__ == '__main__':
     2     print('================欢迎来到图片选择器v1.0=====================')
     3     print('''=====================提示信息=============================
     4                     1:电脑壁纸
     5                     2:手机壁纸
     6                     3.动态壁纸
     7                                 。。。。
     8                     9:可爱壁纸
     9     ''')
    10     Total_label()
    11     num = str(input("请输入您的选择:"))
    12     '''页数+标题url'''
    13     page_n,url = Grab(num)
    14     print('%s页数为:%s, url:%s'%(num,page_n,url))
    15     get_paging(url,page_n)
    16     extract()

    实现效果:

    结尾:

    该程序比较低级,可以说很垃圾,小编自己都感觉很垃圾,有很多没有完善的地方,使用的面向过程的,没有多线程,没有异常处理,代码啰嗦等。

    胜在学习思路吧,该网站是没有反爬的,基本网站,但是不要过度的请求,给对方服务器留条活路,后期会把完善的代码重做一期跟大家一起学习。

  • 相关阅读:
    jsp Servlet 3.0文件上传
    Android 模拟多线程下载
    Android之Handler用法总结
    Android 手机模拟器安卓软件
    Json笔记
    java.lang.ClassNotFoundException: com.google.gson.Gson”
    关于MD5加密
    Android 抽屉布局
    Android ListView 适配器
    如何在安裝SELinux的环境执行Quartus II
  • 原文地址:https://www.cnblogs.com/xbhog/p/11745875.html
Copyright © 2020-2023  润新知