Scrapy是一个基于Python的开源网络爬虫框架。它使用Twisted来实现异步处理和多线程,支持从网页中提取内容并存储为结构化数据。Scrapy的核心组件包括:引擎(engine)、调度器(scheduler)、下载器(downloader)、爬虫(spider)、数据项(item)和管道(pipeline)。
引擎(Engine):负责控制整个爬虫的运行流程,包括调度器、下载器、爬虫和管道。
调度器(Scheduler):负责将请求加入到队列中,并在引擎指令下等待被下载。
下载器(Downloader):负责下载网页,并将下载的网页响应传递给爬虫。
爬虫(Spider):负责解析响应中的网页内容,提取并生成数据项。
管道(Pipeline):负责将数据项处理并存储到文件或数据库中。
我们以爬取微博热搜为例,来介绍Scrapy的具体使用方法。
在命令行中输入以下命令创建一个新的Scrapy项目:
scrapy startproject weibo
进入项目根目录,并输入以下命令创建一个新的爬虫Spider:
cd weibo
scrapy genspider weibotop "https://s.weibo.com/top/summary?cate=realtimehot"
生成的weibotop.py文件中包含了一个名为WeibotopSpider的Spider类,该类继承自Scrapy提供的Spider基类。该类主要定义了抓取的起始页面URL,并通过回调函数对每个响应进行处理。
通过修改项目根目录下的settings.py文件,可以定义一些爬虫的全局配置,如爬虫的并发数、下载延迟等。在该文件中,我们还可以定义爬虫规则(即分别定义item和pipeline路径)。
例如,我们可以添加以下配置:
ITEM_PIPELINES = {
'weibo.pipelines.WeiboPipeline': 300,
}
FEED_FORMAT = 'json'
FEED_URI = 'result.json'
表示我们将数据存储为JSON格式,并将其存储在result.json文件中。
其中,'weibo.pipelines.WeiboPipeline'是我们定义的管道(pipeline)路径,300是表示执行顺序的优先级,数值越小表示执行的优先级越高。
在Spider类中,我们可以定义解析响应的方式。例如,对于微博热搜,我们可以使用XPath或CSS Selector来提取热搜的姓名、链接地址和热度等信息。
示例代码如下:
import scrapy
from weibo.items import WeiboItem
class WeibotopSpider(scrapy.Spider):
name = 'weibotop'
allowed_domains = ['s.weibo.com']
start_urls = ['https://s.weibo.com/top/summary?cate=realtimehot']
def parse(self, response):
for hot in response.xpath('//table/tbody/tr'):
item = WeiboItem()
item['name'] = hot.xpath('td[@class="td-02"]/a/text()').extract_first()
item['link'] = hot.xpath('td[@class="td-02"]/a/@href').extract_first()
item['hot'] = hot.xpath('td[@class="td-02"]/span/text()').extract_first()
yield item
其中,xpath方法是Scrapy提供的,用于在响应中提取相应的元素。
在Scrapy中,通过定义Item类来说明待爬取的数据的格式。在我们的微博热搜爬虫中,数据格式如下:
import scrapy
class WeiboItem(scrapy.Item):
name = scrapy.Field()
link = scrapy.Field()
hot = scrapy.Field()
通过以下命令来启动爬虫:
scrapy crawl weibotop
爬虫运行结果将被存储在result.json文件中。
以上就是使用Scrapy框架爬取微博热搜的攻略。使用Scrapy可以快速构建高效的网络爬虫,并方便地存储数据。Scrapy的核心组件让我们可以轻松地定义我们的爬虫规则,并方便地提取和处理数据。在实践中,我们可以根据具体需要添加或修改组件并对其进行配置。