摘要:整理一下,完整的函数长这样批量运行上述的步骤仅仅能够下载第一个壁纸列表页的第一张壁纸。
项目地址:https://github.com/jrainlau/w...
前言好久没有写文章了,因为最近都在适应新的岗位,以及利用闲暇时间学习python。这篇文章是最近的一个python学习阶段性总结,开发了一个爬虫批量下载某壁纸网站的高清壁纸。
注意:本文所属项目仅用于python学习,严禁作为其他用途使用!初始化项目
项目使用了virtualenv来创建一个虚拟环境,避免污染全局。使用pip3直接下载即可:
pip3 install virtualenv
然后在合适的地方新建一个wallpaper-downloader目录,使用virtualenv创建名为venv的虚拟环境:
virtualenv venv . venv/bin/activate
接下来创建依赖目录:
echo bs4 lxml requests > requirements.txt
最后yun下载安装依赖即可:
pip3 install -r requirements.txt分析爬虫工作步骤
为了简单起见,我们直接进入分类为“aero”的壁纸列表页:http://wallpaperswide.com/aer...。
可以看到,这一页里面一共有10张可供下载的壁纸。但是由于这里显示的都是缩略图,作为壁纸来说清晰度是远远不够的,所以我们需要进入壁纸详情页,去找到高清的下载链接。从第一张壁纸点进去,可以看到一个新的页面:
因为我机器是Retina屏幕,所以我打算直接下载体积最大的那个以保证高清(红圈所示体积)。
了解了具体的步骤以后,就是通过开发者工具找到对应的dom节点,提取相应的url即可,这个过程就不再展开了,读者自行尝试即可,下面进入编码部分。
访问页面新建一个download.py文件,然后引入两个库:
from bs4 import BeautifulSoup import requests
接下来,编写一个专门用于访问url,然后返回页面html的函数:
def visit_page(url): headers = { "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.108 Safari/537.36" } r = requests.get(url, headers = headers) r.encoding = "utf-8" return BeautifulSoup(r.text, "lxml")
为了防止被网站反爬机制击中,所以我们需要通过在header添加UA把爬虫伪装成正常的浏览器,然后指定utf-8编码,最后返回字符串格式的html。
提取链接在获取了页面的html以后,就需要提取这个页面壁纸列表所对应的url了:
def get_paper_link(page): links = page.select("#content > div > ul > li > div > div a") return [link.get("href") for link in links]
这个函数会把列表页所有壁纸详情的url给提取出来。
下载壁纸有了详情页的地址以后,我们就可以进去挑选合适的size了。在对页面的dom结构分析后可以知道,每一个size都对应着一个链接:
所以第一步,就是把这些size对应的链接提取出来:
wallpaper_source = visit_page(link) wallpaper_size_links = wallpaper_source.select("#wallpaper-resolutions > a") size_list = [{ "size": eval(link.get_text().replace("x", "*")), "name": link.get("href").replace("/download/", ""), "url": link.get("href") } for link in wallpaper_size_links]
size_list就是这些链接的一个集合。为了方便接下来选出最高清(体积最大)的壁纸,在size中我使用了eval方法,直接把这里的5120x3200给计算出来,作为size的值。
获取了所有的集合之后,就可以使用max()方法选出最高清的一项出来了:
biggest_one = max(size_list, key = lambda item: item["size"])
这个biggest_one当中的url就是对应size的下载链接,接下来只需要通过requests库把链接的资源下载下来即可:
result = requests.get(PAGE_DOMAIN + biggest_one["url"]) if result.status_code == 200: open("wallpapers/" + biggest_one["name"], "wb").write(result.content)
注意,首先你需要在根目录下创建一个wallpapers目录,否则运行时会报错。
整理一下,完整的download_wallpaper函数长这样:
def download_wallpaper(link): wallpaper_source = visit_page(PAGE_DOMAIN + link) wallpaper_size_links = wallpaper_source.select("#wallpaper-resolutions > a") size_list = [{ "size": eval(link.get_text().replace("x", "*")), "name": link.get("href").replace("/download/", ""), "url": link.get("href") } for link in wallpaper_size_links] biggest_one = max(size_list, key = lambda item: item["size"]) print("Downloading the " + str(index + 1) + "/" + str(total) + " wallpaper: " + biggest_one["name"]) result = requests.get(PAGE_DOMAIN + biggest_one["url"]) if result.status_code == 200: open("wallpapers/" + biggest_one["name"], "wb").write(result.content)批量运行
上述的步骤仅仅能够下载第一个壁纸列表页的第一张壁纸。如果我们想下载多个列表页的全部壁纸,我们就需要循环调用这些方法。首先我们定义几个常量:
import sys if len(sys.argv) != 4: print("3 arguments were required but only find " + str(len(sys.argv) - 1) + "!") exit() category = sys.argv[1] try: page_start = [int(sys.argv[2])] page_end = int(sys.argv[3]) except: print("The second and third arguments must be a number but not a string!") exit()
这里通过获取命令行参数,指定了三个常量category, page_start和page_end,分别对应着壁纸分类,起始页页码,终止页页码。
为了方便起见,再定义两个url相关的常量:
PAGE_DOMAIN = "http://wallpaperswide.com" PAGE_URL = "http://wallpaperswide.com/" + category + "-desktop-wallpapers/page/"
接下来就可以愉快地进行批量操作了,在此之前我们来定义一个start()启动函数:
def start(): if page_start[0] <= page_end: print("Preparing to download the " + str(page_start[0]) + " page of all the "" + category + "" wallpapers...") PAGE_SOURCE = visit_page(PAGE_URL + str(page_start[0])) WALLPAPER_LINKS = get_paper_link(PAGE_SOURCE) page_start[0] = page_start[0] + 1 for index, link in enumerate(WALLPAPER_LINKS): download_wallpaper(link, index, len(WALLPAPER_LINKS), start)
然后把之前的download_wallpaper函数再改写一下:
def download_wallpaper(link, index, total, callback): wallpaper_source = visit_page(PAGE_DOMAIN + link) wallpaper_size_links = wallpaper_source.select("#wallpaper-resolutions > a") size_list = [{ "size": eval(link.get_text().replace("x", "*")), "name": link.get("href").replace("/download/", ""), "url": link.get("href") } for link in wallpaper_size_links] biggest_one = max(size_list, key = lambda item: item["size"]) print("Downloading the " + str(index + 1) + "/" + str(total) + " wallpaper: " + biggest_one["name"]) result = requests.get(PAGE_DOMAIN + biggest_one["url"]) if result.status_code == 200: open("wallpapers/" + biggest_one["name"], "wb").write(result.content) if index + 1 == total: print("Download completed! ") callback()
最后指定一下启动规则:
if __name__ == "__main__": start()运行项目
在命令行输入如下代码开始测试:
python3 download.py aero 1 2
然后可以看到下列输出:
拿charles抓一下包,可以看到脚本正在平稳地运行中:
此时,下载脚本已经开发完毕,终于不用担心壁纸荒啦!
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/41291.html
摘要:爬取分辨率超清唯美壁纸简介壁纸的选择其实很大程度上能看出电脑主人的内心世界,有的人喜欢风景,有的人喜欢星空,有的人喜欢美女,有的人喜欢动物。 @[toc] 爬取5K分辨率超清唯美壁纸 简介 壁纸的选择其实很大程度上能看出电脑主人的内心世界,有的人喜欢风景,有的人喜欢星空,有的人喜欢美女,有的人喜欢动物。然而,终究有一天你已经产生审美疲劳了,但你下定决定要换壁纸的时候,又发现网上的壁纸要...
摘要:爱美之心人皆有之,正所谓窈窕淑女君子好逑,美好敲代码的一天从好看的桌面壁纸开始,好看的桌面壁纸从美女壁纸开始。 大家好,我是辣条,这是我爬虫系列的第26篇。 爱美之心人皆有之,正所谓窈窕淑女君子好逑,美好敲代码的一天从好看的桌面壁纸开始,好看的桌面壁纸从美女壁纸开始。今天给大家带来福利啦,爬...
摘要:没有结果返回百度搜索的可以指定页码,最多一页个,使用后有效减少了连接次数。但亲测下来设置过以后的结果与实际用户在百度搜索的结果排序和个数都有出入。 showImg(https://segmentfault.com/img/bVbnA0I?w=1280&h=787); 一直有一个需求,希望看到自己网站在百度的实时的排名用过一些工具,要么反应迟钝,要么结果不准确或不实时于是打算用jsoup...
摘要:时间永远都过得那么快,一晃从年注册,到现在已经过去了年那些被我藏在收藏夹吃灰的文章,已经太多了,是时候把他们整理一下了。那是因为收藏夹太乱,橡皮擦给设置私密了,不收拾不好看呀。 ...
阅读 813·2023-04-25 20:18
阅读 2096·2021-11-22 13:54
阅读 2530·2021-09-26 09:55
阅读 3864·2021-09-22 15:28
阅读 2974·2021-09-03 10:34
阅读 1713·2021-07-28 00:15
阅读 1631·2019-08-30 14:25
阅读 1283·2019-08-29 17:16