优美库图片系统

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

实现效果:

结尾:

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

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

posted @ 2019-10-26 22:23  xbhog  阅读(600)  评论(0编辑  收藏  举报