正主登场,前面我们介绍了爬虫开始前的一些外围工作,现在,我们终于开始讨论爬虫了。
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。