网址:元气壁纸 - 电脑壁纸,手机壁纸,桌面壁纸,高级质感壁纸大全 (cheetahfun.com)
这是我的文章封面图片的主要来源地,里面的图片质量还是很高的。该爬虫能实现对其的高速批量下载。
相对于之前写的XKCD漫画获取爬虫 | tsuki の Blog ,这次使用了模拟用户代理池 ,避免同一个UA 的高频请求然后被封禁IP 。
使用面向对象的方法编写爬虫程序,主要编写五个函数,分别是请求函数、菜单函数、图片下载函数、翻页函数、主函数。
github地址:
效果展示
源代码 模拟用户代理池 User-Agent (用户代理)池,就是把多个浏览器的UA信息放进列表中,然后再从中随机选择。构建用户代理池,能够避免总是使用一个 UA 来访问网站,因为短时间内总使用一个UA高频率访问的网站,可能会引起网站的警觉,从而封杀掉IP。
所以需要在项目目录中新建ua_info.py
文件。
1 2 3 4 5 6 7 8 9 10 11 12 ua_list = [ 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Maxthon 2.0' , 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_0) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11' , 'User-Agent:Opera/9.80 (Windows NT 6.1; U; en) Presto/2.8.131 Version/11.11' , 'Mozilla/5.0 (Windows NT 6.1; rv:2.0.1) Gecko/20100101 Firefox/4.0.1' , 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)' , 'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50' , 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0' , 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1' , 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1' , 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:2.0.1) Gecko/20100101 Firefox/4.0.1' , ]
主程序 虽然实现过程和XKCD漫画获取爬虫 | tsuki の Blog 基本相同,但是这段代码使用了面向对象的方法,程序的思路更加清晰、易懂,逻辑结构较为固定。
main.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 import requestsimport randomimport bs4from ua_info import ua_listimport osclass YuanQi (object ): def __init__ (self ): self.url = None self.kind = None self.page_end = 0 self.page_begin = 0 self.page_now = 0 def select (self ): print ("请选择需要下载的壁纸类型:\n" ) print ("1.动漫\n2.风景\n3.美女\n" ) slt = int (input ()) if slt == 1 : self.url = 'https://bizhi.cheetahfun.com/dn/c2j/' self.kind = '动漫' path = 'E:/元气壁纸爬虫/' + self.kind self.mk_dir(path) elif slt == 2 : self.url = 'https://bizhi.cheetahfun.com/dn/c1j/' self.kind = '风景' path = 'E:/元气壁纸爬虫/' + self.kind self.mk_dir(path) else : self.url = 'https://bizhi.cheetahfun.com/dn/c3j/' self.kind = '美女' path = 'E:/元气壁纸爬虫/' + self.kind self.mk_dir(path) print ('选择成功!!!\n请输入下载的起始页:\n' ) self.page_begin = int (input ()) self.page_end = int (input ()) self.page_now = self.page_begin print ('正在下载中……\n' ) def get_html (self, url ): headers = {'User-Agent' : random.choice(ua_list)} req = requests.get(url=url, headers=headers) html_file = open ('index.html' , 'wb' ) for chunk in req.iter_content(10000 ): html_file.write(chunk) html_file.close() def mk_dir (self, path ): path = path.strip() isExists = os.path.exists(path) if not isExists: os.mkdir(path) return True else : return False def download_img (self ): html_file = open ('index.html' , encoding='utf-8' ) soup = bs4.BeautifulSoup(html_file.read(), 'html.parser' ) elems = soup.select('img[class="w-full h-full object-fill"]' ) for i in range (0 , 18 ): headers = {'User-Agent' : random.choice(ua_list)} img_url = elems[i].get('src' ) title = elems[i].get('title' ) img_req = requests.get(url=img_url, headers=headers) try : file_ad = self.kind + '/' + title.replace("?" , "" ) + '.jpg' jpg = open (file_ad, 'wb' ) for chunk in img_req.iter_content(10000 ): jpg.write(chunk) jpg.close() except : file_ad = self.kind + '/第' + str (self.page_begin) + '页第' + str (i) + '张' + '.jpg' jpg = open (file_ad, 'wb' ) for chunk in img_req.iter_content(10000 ): jpg.write(chunk) jpg.close() def next_page (self ): self.page_now += 1 next_url = self.url + 'p' + str (self.page_now) return next_url def run (self ): self.select() link = self.url + 'p' + str (self.page_begin) for i in range (self.page_begin, self.page_end + 1 ): self.get_html(link) self.download_img() link = self.next_page() print ('下载完成!!!' ) if __name__ == '__main__' : try : spider = YuanQi() spider.run() except Exception as e: print ("错误:" , e)
请求函数 最终的结果是下载当前页面的HTML
文件,以方便后续的函数调用它来获取图片的资源地址。
菜单函数 顾名思义就是供用户选择下载壁纸的类型与起始页面。
图片下载函数 从下载的当前页面的HTML
文件中选中包含壁纸资源地址的<img>
元素,获取资源地址后将其下载在指定的文件夹。
翻页函数 实现比较简单,该网站的页面URL
规律很好找,所以下一页的URL
拼接就非常容易了。
主函数 充当整个爬虫程序的桥梁,通过调用不同的功能函数,实现数据的最终抓取,是整个程序的入口。