Scrapy框架学习(三)—-Scrapy框架实现简单的爬虫程序
前面2章讲解了Scrapy的基本内容,如:创建项目,配置settings.py
,items,spider,item pipeline,scrapy shell等概念,现在我们使用之前学习的内容,来实现一个爬虫案例。
爬虫案例以虎嗅网新闻子页面为例。页面的url:https://www.huxiu.com/channel/104.html
,爬取的内容:标题、发布者以及摘要三个字段。
因为是初学Scrapy,爬取的数据比较简单,下面的scrapy实现爬虫的步骤:
- 创建项目
- 创建Item,定义好需要数据的字段
- 创建Spider,设置需要获取数据的解析规则
- 创建Item Pipeline,保存需要的数据
- 修改settings.py的设置
- 运行项目
1. 创建项目
在项目的父目录,通过命名scrapy startproject huxiu
,创建项目,通过PyCharm打开项目。
项目目录如下:
2. 创建Item,定义好需要数据的字段
在items.py文件中,创建一个HuxiuItem的类(默认创建),在类中定义好我们需要的字段。如:
import scrapy
class HuxiuItem(scrapy.Item):
title = scrapy.Field()
publisher = scrapy.Field()
abstract = scrapy.Field()
3. 创建Spider,设置需要获取数据的解析规则
在spider目录创建一个huxiu_spider.py文件,在该文件中定义HuxiuSpider类,定义spider的名称,需要爬取的url,实现parse()方法。如:
import scrapy
from huxiu.items import HuxiuItem
class HuxiuSpider(scrapy.Spider):
# Spider的名称
name = 'huxiu'
# 爬取的url
start_urls = ['https://www.huxiu.com/channel/104.html']
def parse(self, response):
"""
解析页面的响应数据,因为解析的数据比较多,使用yield关键字,将怎个方法作为生成器,迭代获取解析的数据
:param response: 响应的数据
:return:
"""
# 解析列表,获取当前页面所有的列表数据
for sele in response.xpath('//div[@class="mob-ctt"]'):
# 创建item对象
item = HuxiuItem()
# 解析到标题的标签
element = sele.xpath("./h2/a/text()")
# 获取到标题的标签的文本数据
title = element[0].extract()
# 解析到摘要的标签
element = sele.xpath('.//div[@class="mob-sub"]/text()')
# 获取到摘要的文本数据
abstract = element[0].extract()
# 解析到发布者的标签
element = sele.xpath('.//span[@class="author-name"]/text()')
# 获取到发布者的文本数据
publisher = element[0].extract()
# 将文本信息,赋值给item
item['title'] = title
item['publisher'] = publisher
item['abstract'] = abstract
# 作为生成器,返回
yield item
4. 创建Item Pipeline,保存需要的数据
在pipeline.py
文件中,定义HuxiuPipeline
类,我们需要将item
的数据,写入到文件,需要在初始化时,创建文件对象,在process_item()
写入文件,在close_spider()
将文件关闭(以后可以使用数据库来存储)。具体如下:
import json
class HuxiuPipeline(object):
def __init__(self):
# 在初始化时,创建一个file对象
self.file = open('huxiu.json', 'w', encoding='utf-8')
def process_item(self, item, spider):
# 通过将item转成字典类型,在转成json数据
content = json.dumps(dict(item), ensure_ascii=False) + "\n"
# 将内容写到文件中
self.file.write(content)
# 返回item,必须返回
return item
def close_spider(self, spider):
# 在爬虫结束后,关闭文件
self.file.close()
5. 修改settings.py的设置
修改settings.py
文件,将ITEM_PIPELINES
的注释打开,将HuxiuPipeline
类配置好(默认已配置)。将DEFAULT_REQUEST_HEADERS
的注释打开,配置好请求头数据。如:
DEFAULT_REQUEST_HEADERS = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.89 Safari/537.36',
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
# 'Accept-Language': 'en',
}
...
ITEM_PIPELINES = {
'huxiu.pipelines.HuxiuPipeline': 300,
}
6. 运行项目
接下来就是运行项目了,在控制台执行下面命令:
scrapy crawl huxiu
在项目的根目录就会生成一个huxiu.json
文件。