最近发现了一个国外很不错的壁纸网站 Simple Desktop ,所有的壁纸都是扁平风格。如果你的系统主题是扁平风格,或者你对扁平化的壁纸情有独钟,那么这个网站一定适合你。因为所有的壁纸看着都很喜欢,就利用爬虫把壁纸的原图链接爬取下来。

首先看一下 Simple Desktop 网页,网页结构比较整齐,还是很好爬取的。 img 我们先利用最基本的正则爬取网页。

利用正则表达式爬取

from multiprocessing import Pool
import requests
import re

headers = {
    "User-Agent":"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36"
}

def get_page(url):
    response = requests.get(url)
    if response.status_code == 200:
        return response.text
    return None

def parse_index_page(url):
    pattern = re.compile("<a href="(.*?)"><img src=".*?" title=".*?" alt=".*?" width=".*?" height=".*?" /></a>")
    items = re.findall(pattern, url)
    return ["http://simpledesktops.com"+item for item in items]

def parse_photo_page(url):
    pattern = re.compile("<a href=".*?"><img src="(.*?).625x385_q100.png" title="(.*?)" alt=".*?" width="625px" height="385px"/></a>")
    items = re.findall(pattern, url)
    for item in items:
        yield {
            "title": item[1],
            "url":item[0]
        }

def main(page):
    url = "http://simpledesktops.com/browse/{}/".format(page)
    html = get_page(url)
    items = parse_index_page(html)
    for item in items:
        url = get_page(item)
        htmls = parse_photo_page(url)
        for html in htmls:
            print(html)

if __name__ == "__main__":
    pool = Pool()
    try:
        pool.map(main, [page for page in range(1,51)])
    except BaseException as e:
        print("Error:",e)

代码主要是利用正则爬取每个壁纸的链接,再找到壁纸的原图链接。其实在后来的爬取过程中发现根本没有这么复杂,在爬取到封面图片的链接后,去掉后边的一些内容就是壁纸原图的链接,因为手懒,所以这段代码就没修改。。。

利用BeautifulSoup爬取

from multiprocessing import Pool
from bs4 import BeautifulSoup
import requests
import re

def get_page(url):
    html = requests.get(url).text
    bsobj = BeautifulSoup(html, "lxml")
    return bsobj

def parse_page(html):
    items = html.findAll("div",{"class":"desktop"})
    for item in items:
        print("title: {}
url: {}".format(item.img["title"],re_page(item.img["src"])))

def re_page(html):
    pattern = re.compile("(.*?).295x184_q100.png")
    items = re.findall(pattern, html)
    for item in items:
        return item

def main(page):
    url = "http://simpledesktops.com/browse/{}/".format(page)
    html = get_page(url)
    parse_page(html)

if __name__ == "__main__":
    p = Pool()
    p.map(main, [page for page in range(1,51)])

从代码的行数就能看出来,明显少了一半。因为发现这个规律后,只要利用正则提取出壁纸原图的链接就可以了。 这两部分代码都没有做保存处理,下一篇文章会保存到mongo数据库中。 效果图: img 利用了多进程爬取,效率还是很高的。

最后修改:2021 年 03 月 16 日 09 : 07 PM
如果觉得我的文章对你有用,请随意赞赏