手把手教你写 Python 异步爬虫

本文以一个我自己打磨了一个多月,反复修改之后终于达到能用,好用,甚至傻瓜式使用程度的爬虫为例,在此分享这个爬虫是怎么写出来的,其中遇到多少坑。

爬取的是一个壁纸网站:https://wallhaven.cc

先来分析这个网站,在toplist页面按下F12(Chrome浏览器)选择Elements,点一下左边那个小箭头再点一下图片:
分析网页
可以看到图片就藏在这个figure里,但是别急,这只是缩略图,我们点进图片链接看看大图是怎样的:
图片好大,网速不行打开好慢
找到了,在class="scrollboximg里。

这时候可能会有不太聪明的小朋友会提问了,是不是从toplist里把每张图的详情链接找出来,再进入这些详情链接里找到图片url,就可以下载了呢?

确实是这样没错,我一开始也是这么做的,但是你仔细看一看详情链接和图片url,是不是长得很像?得益于这个网站对图片的命名规律,我们可以直接从缩略图得到的链接直接推导出图片url。

page_url = 'https://wallhaven.cc/w/zmr6qv'
img_url = 'https://w.wallhven.cc/full/zm/wallhaven-zmr6qv.jpg'
small_name = page_url.split('/')[-1]
little_name = small_name[0:2]
full_url = 'https://w.wallhaven.cc/full/' + little_name + '/wallhaven-' + small_name + '.jpg'

这样就省去了进一步请求网页的麻烦,实际上这个网站对你的访问是有限制的,同一时间只能请求一个网页,多了就失败,想想一个个去等待网页得多久啊。

观察一下toplist的url,多换几个选项在搜索栏回车,很容易就找出规律

'https://wallhaven.cc/search?categories=111&purity=100&topRange=1M&sorting=toplist&order=desc&page=2

从左到右,100代表SFW,1M代表一个月,toplist代表排行榜,2是页数

这时候可能又有心术不正的小朋友提问了:那我想爬NSFW怎么办呢?
那就把100换成001

但是啊,现在是未登录状态,直接看是不给看的,还得登录,还得先在个人设置里把NSFW按钮打开

我们再来看看怎么模拟登录:
在这里插入图片描述
同样按F12,选择Network,勾选Preserve log,登录一遍,找到login,在From Data里我们发现,浏览器不仅向服务器发送了账户密码,还有一个_token,这是个什么东西?退出登录,回到登录界面,按Ctrl+F,输入token:
在这里插入图片描述
找到了,原来是被隐藏了起来,因此在爬取图片之前,得先请求登录界面,把token, username, password一起post给服务器。

分析完网页下面开始写代码。
导入模块

from tqdm import tqdm
from bs4 import BeautifulSoup
from time import time
import aiohttp, asyncio, os

登录函数:

async def login():
    '''登录'''
    print('开始登录...')
    # 登录界面的url
    login_index_url = 'https://wallhaven.cc/login'
    # 这个tc是为后面下载图片失败重新下载断点续传做的准备
    async with aiohttp.connector.TCPConnector(limit=300, force_close=True, enable_cleanup_closed=True) as tc:
        async with aiohttp.ClientSession(connector=tc) as session:
            async with session.get(login_index_url, headers=headers) as response
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值