zoukankan      html  css  js  c++  java
  • 优美库图片系统

    今天制作一个优美库图片小程序,网址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()

    实现效果:

    结尾:

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

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

  • 相关阅读:
    2021,6,10 xjzx 模拟考试
    平衡树(二)——Treap
    AtCoder Beginner Contest 204 A-E简要题解
    POJ 2311 Cutting Game 题解
    Codeforces 990G GCD Counting 题解
    NOI2021 SDPTT D2T1 我已经完全理解了 DFS 序线段树 题解
    第三届山东省青少年创意编程与智能设计大赛总结
    Luogu P6042 「ACOI2020」学园祭 题解
    联合省选2021 游记
    Codeforces 1498E Two Houses 题解 —— 如何用结论吊打标算
  • 原文地址:https://www.cnblogs.com/xbhog/p/11745875.html
Copyright © 2011-2022 走看看