教你爬取妹子图(二)码上有妹子

174 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第6天,点击查看活动详情

声明

本人所有逆向、破解及爬虫相关教程均是以纯技术的角度来探讨研究和学习,严禁使用教程中提到的技术去破解、滥用、伤害其他公司及个人的利益,以及将以下内容用于商业或者非法用途。

前言

上一篇我们对即将要爬取的网站进了分析,我们接下来就来写代码来真正爬取

框架与工具

我们使用的爬虫框架是 hssp框架,这个框架相关的先不在这里讲,有兴趣的点进去看看。

因为我们要爬取的是图片和相关的数据,其中图片可以选择下载或只是使用图片地址的方式,我们这里先不选择下载,只是保存图片地址

编码

Item

我们先根据上一节中要爬取的数据及元素位置来定义爬取的元素Item,先上代码

from hssp import Spider, Response
from hssp.item import Item, Field


class WeiMeiItem(Item):
    # 标题
    title = Field(css_select='h1::text')
    # 分类
    category = Field(css_select='span[class="d-none d-md-inline-block"] a::text')
    # 图片
    images = Field(css_select='div[class="nc-light-gallery"] img::attr(src)', many=True)
    # 标签
    tags = Field(css_select='.post-tags a::text', many=True)
    # 封面
    cover = Field(css_select='.post-poster .media-content::attr(style)')
    # 爬取来源
    web_src = Field()
    # 插入时间
    created_at = Field()
    
    def _clean_cover(self, text):
        """
        封面图的后处理
        Args:
            text:

        Returns:

        """
        result = re.findall(r'src=(.*?)&', text)
        return result[0] if result else text

我们首先创建了个类继承了Item类,下面定义了我们要爬取的各个方法,其中Field代表字段,里面的css_select属性代表css选择器的方法,是和scrapy的选择器通用的,其中images、tags字段新加了many属性,这个表示多个的意思,也就是说有多个图片和字段,会保存成列表的形式

其中web_src、created_at字段表示需要后期手动设置信息的字段,而不是自动提取的

随后我们定义了一个_clean_cover的方法,此方法是处理封面图的文字内容的

爬取

先看代码:

class WeiMeiSp(Spider):
    start_urls = ['https://www.vmgirls.com/archives/']

    async def parse(self, response: Response):
        urls = response.css('.al_post_list a::attr(href)').getall()
        for url in urls:
            yield self.get(url, callback=self.parse_images)

    async def parse_images(self, response: Response):
        item = await WeiMeiItem.extract(response=response)
        item.web_src = response.url
        item.created_at = datetime.now().isoformat()
        yield item


def main():
    setting = Setting(
        out_path=['weimei.json', 'weimei.csv']
    )
    WeiMeiSp.start(setting=setting)
  • 先定义了一个WeiMeiSp类,此类是爬虫的主要类,定义了一个数据,叫做start_urls,意思是和scrapy一样的,代表开始的url列表
  • 后面写了一个parse方法,此方法是爬虫的第一个方法,也就是解析start_urls的方法,再这个方法里面获取所有的文章连接,然后通过回调的方式继续执行
  • parse_images方法是解析文章的,这里使用到了上面定义的WeiMeiItem类,然后通过extract方法传入响应体,会自动解析item,然后再手动补齐来源地址和创建时间,最后再返回item
  • 通过WeiMeiSp.start(setting=setting)方法来执行此爬虫
  • Setting是一些设置项,其中设置了out_path属性,这个属性可以是一个迭代类型或字符串类型,可以定义一个或多个输出文件,支持json、xml、csv、xls、xlsx等格式

执行结果示例

结语

到此为止这个网站的所有内容算是初步的爬取完成了,为啥说是初步的呢,一是因为不能即使更新,二是因为只是保存在了本地文件中,不能很好的利用它