爬虫Scrapy笔记(四)、spider

正主登场,前面我们介绍了爬虫开始前的一些外围工作,现在,我们终于开始讨论爬虫了。

class OschinaSpider(scrapy.Spider):
 ......
    def parse(self, response):
        pass

他也很简单,继承 Spider 类,我们只要实现 parse 接口就好了,parse 接受一个 response 参数。
在我们实现以前先理一下逻辑。我们首先需要从找到所有的文章,他的页面文章大致如下图:

其次,我们需要找到页面上具体元素的信息,如下图

我们只要解析好上面两组信息就好了,解析第一组信息是为了找到具体文章,之后把信息交给 scrapy 的 schedule 组件,通过Downloader去请求文章,之后再将结果返回给爬虫,解析第二组信息,就是具体要持久化的信息,这样一来就好办了。
我们来看下代码:


def parse(self, response): # 通过xpath定位文件,找到文章url链接 news_href = response.xpath( '//div[@class="page"]/div[@class="box vertical news"]/a[@class="news-link primary " or @class="news-link primary visited " ]/@href').extract() # 循环获取到的数据,让scrapy重新请求,过滤下,只请求news信息 for news in news_href: if news.startswith("https://www.oschina.net/news"): # 执行yield生成器,结果回调news_detail yield scrapy.Request(news, callback=self.news_detail) def news_detail(self, response): # 生成一个SampleItem容器 item = SampleItem() # 解析具体的字段 # 标题 item['title'] = response.xpath('//div[@class="article-detail"]/h2[@class="header"]/text()').extract() # 作者 item['author'] = response.xpath( '//div[@class="article-detail"]/div[@class="extra ui horizontal list meta-wrap"]/div[@class="item"]/a[@class="__user"]/span/text()').extract() # 收藏 item['collect'] = response.xpath( '//div[@class="article-detail"]/div[@class="extra ui horizontal list meta-wrap"]/div[@class="item collect-btn "]/span/text()').extract() # 评论 item['comment'] = response.xpath( '//div[@class="article-detail"]/div[@class="extra ui horizontal list meta-wrap"]/div[@class="item comment-count"]/a[@class="normal"]/span/text()').extract() # 执行yield生成器,让pipeline处理 yield item

现在来启动我们的爬虫


执行成功,我们来看下执行的结果

成功生成了数据

这样,我们就完成了一只爬虫的基本任务。之后我们就可以基于这些数据做一些分析,应用到相应的业务中去。总的来说,还是很简单的,最主要的是要动手,看着简单,时间操作中还是会遇到各种各样的问题。
做爬虫始终绕不开一个问题,就是反爬,反爬的技术有很多,需要具体问题具体分析。下一节,我们学学最简单的user-agent和代理ip。

发表评论

邮箱地址不会被公开。 必填项已用*标注