持续创作,加速成长!这是我参与「掘金日新计划 · 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等格式
执行结果示例
结语
到此为止这个网站的所有内容算是初步的爬取完成了,为啥说是初步的呢,一是因为不能即使更新,二是因为只是保存在了本地文件中,不能很好的利用它