python爬虫之scrapy框架详解
Scrapy是Python中一个强大的爬虫框架,它可以让我们轻松高效地从各种类型的网站中获取数据。本文将详细讲解Scrapy框架的使用和工作原理,让大家快速上手使用。
Scrapy框架的安装
Scrapy框架依赖于很多第三方库,所以在安装之前必须先安装好其他的依赖。在安装Scrapy之前,我们需要确保已安装好以下软件:
- Python 3.x
- pip
接下来,我们可以使用以下命令安装Scrapy框架:
pip install scrapy
Scrapy框架的使用
创建一个新的Scrapy项目
使用Scrapy框架创建一个新的项目非常简单,只需要在命令行中运行以下命令:
scrapy startproject myproject
其中,myproject是我们自定义的项目名称。这个命令将会在当前目录下创建一个名为myproject的新文件夹,其中包含了一个基础的Scrapy爬虫项目结构。
编写爬虫
在Scrapy框架中,每个爬虫都由一个Spider类来定义。我们需要编写一个Spider类来告诉Scrapy框架我们要爬取哪些网站、从哪里开始爬取、如何爬取以及如何处理提取到的数据。
下面是一个简单的Spider类示例,用于爬取example.com网站上的所有页面:
import scrapy
class ExampleSpider(scrapy.Spider):
name = "example"
allowed_domains = ["example.com"]
start_urls = ["http://www.example.com/"]
def parse(self, response):
# 处理提取到的数据
pass
在上述代码中,我们定义了一个名为ExampleSpider的Spider类。这个类中包含了三个类属性:name、allowed_domains和start_urls。name属性是Spider的唯一标识符,用于在运行Scrapy时区分不同的Spider;allowed_domains属性用于指定我们要爬取的网站的域名;start_urls是一个包含了起始链接的列表,Scrapy将从这些链接开始爬取数据。
parse方法是Spider类的核心方法,它获取爬虫处理的响应并返回一个包含提取到的数据的字典或者生成器对象。在这里,我们可以使用XPath或CSS选择器语法来提取我们感兴趣的数据。
运行爬虫
一旦我们编写好了Spider类,就可以使用以下命令来运行爬虫:
scrapy crawl <spider_name>
其中,
提取数据
在Scrapy框架中,我们可以使用Item类来表示爬取到的数据。对于每个需要爬取的数据,我们都可以创建一个对应的Item类,并在parse方法中使用yield语句返回一个新的Item实例。
下面是一个简单的Item类示例,用于表示从example.com网站上爬取到的文章数据:
import scrapy
class ArticleItem(scrapy.Item):
title = scrapy.Field()
author = scrapy.Field()
content = scrapy.Field()
在上述代码中,我们定义了一个名为ArticleItem的Item类,其中包含了三个属性:title、author和content。我们可以通过调用Item类的Field方法来定义每个属性的数据类型。
在parse方法中,我们可以创建一个新的ArticleItem实例,并将提取到的数据赋值给对应的属性:
def parse(self, response):
title = response.css("h1.title::text").extract_first()
author = response.css("a.author::text").extract_first()
content = response.css("div.content::text").extract_first()
item = ArticleItem(title=title, author=author, content=content)
yield item
在这里,我们使用CSS选择器语法从响应中提取title、author和content数据,并将这些数据赋值给新的ArticleItem实例的属性。最后,我们使用yield语句来返回这个新的Item实例。
数据存储
在Scrapy框架中,我们可以使用管道(Pipeline)来处理从Spider中提取到的数据。每个管道类都需要实现process_item方法,该方法将会在Spider提取到数据并返回Item实例后被调用。
下面是一个简单的管道类示例,用于将数据存储到MongoDB数据库中:
import pymongo
class MongoDBPipeline(object):
def __init__(self, mongo_uri, mongo_db):
self.mongo_uri = mongo_uri
self.mongo_db = mongo_db
@classmethod
def from_crawler(cls, crawler):
return cls(
mongo_uri=crawler.settings.get('MONGO_URI'),
mongo_db=crawler.settings.get('MONGO_DATABASE')
)
def open_spider(self, spider):
self.client = pymongo.MongoClient(self.mongo_uri)
self.db = self.client[self.mongo_db]
def close_spider(self, spider):
self.client.close()
def process_item(self, item, spider):
self.db[item.__class__.__name__.lower()].insert(dict(item))
return item
在这个示例中,我们使用了pymongo库连接MongoDB数据库。在process_item方法中,我们将Item实例转换为Python字典,并插入到MongoDB中。
示例一:爬取豆瓣电影TOP250
下面是一个实际的爬取豆瓣电影TOP250的Spider类示例,用于从https://movie.douban.com/top250上爬取电影的名称、导演、评分、简介等数据:
import scrapy
class DoubanMovieSpider(scrapy.Spider):
name = "douban_movie"
allowed_domains = ["movie.douban.com"]
start_urls = ["https://movie.douban.com/top250"]
def parse(self, response):
for movie in response.css(".item"):
yield {
"title": movie.css(".title::text").extract_first(),
"director": movie.css(".bd p::text")[0].extract().split(" ")[1],
"star": movie.css(".star span.rating_num::text").extract_first(),
"quote": movie.css(".quote span::text").extract_first(),
}
next_page = response.css(".next a::attr(href)").extract_first()
if next_page is not None:
yield response.follow(next_page, self.parse)
在这里,我们使用了CSS选择器语法提取电影的名称、导演、评分和简介数据,并使用response.follow方法来构造下一页的URL。
示例二:爬取知乎用户信息
下面是一个实际的爬取知乎用户信息的Spider类示例,用于从https://www.zhihu.com上爬取用户ID、昵称、行业、性别、地址等数据:
import scrapy
class ZhihuUserSpider(scrapy.Spider):
name = "zhihu_user"
allowed_domains = ["www.zhihu.com"]
start_urls = ["https://www.zhihu.com"]
def parse(self, response):
yield scrapy.Request(
"https://www.zhihu.com/api/v4/me",
callback=self.parse_user_info,
headers={"authorization": "Bearer " + self.settings.get("ZHIHU_TOKEN")},
)
def parse_user_info(self, response):
data = response.json()
yield {
"user_id": data["id"],
"name": data["name"],
"gender": data["gender"],
"headline": data["headline"],
"business": data["business"]["name"],
"locations": [location["name"] for location in data["locations"]],
"description": data["description"],
}
在这个示例中,我们使用了知乎的API接口获取当前用户的信息,并提取其ID、昵称、行业、性别、地址等数据。
总结
Scrapy框架是一个功能强大、灵活性高、可扩展性强的Python爬虫框架。在本文中,我们详细讲解了Scrapy框架的使用和工作原理,包括创建一个新的Scrapy项目、编写爬虫、运行爬虫、提取数据和数据存储等方面。两个实际的Spider类示例也为大家提供了更加直观的参考。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python爬虫之scrapy框架详解 - Python技术站