一文读懂python Scrapy爬虫框架
1. Scrapy是什么
Scrapy是一个Python爬虫框架,可以用它快速地开发爬虫程序。它有强大的处理HTTP请求和Websocket的能力,支持多个爬虫并发运行。Scrapy还集成了XPath和CSS选择器等多种解析方式,可以轻松地获取所需的数据。
2. Scrapy的安装
Scrapy依赖于Twisted、lxml和pyOpenSSL这几个模块,在安装之前请确保这些模块已经被正确地安装到了Python中。
可以通过pip来安装Scrapy。在命令行中执行以下命令即可:
pip install Scrapy
3. Scrapy的基本结构
在写Scrapy爬虫之前,我们需要了解Scrapy的基本结构。下面是一个Scrapy项目的基本结构:
myproject/
scrapy.cfg
myproject/
__init__.py
items.py
pipelines.py
settings.py
spiders/
__init__.py
spider1.py
- scrapy.cfg:Scrapy项目的配置文件;
- myproject/:项目的Python模块;
- myproject/items.py:定义需要爬取的数据结构;
- myproject/pipelines.py:定义数据的处理方式;
- myproject/settings.py:Scrapy设置文件;
- myproject/spiders/:爬虫代码存放的目录;
- myproject/spiders/spider1.py:具体的爬虫实现。
4. Scrapy的使用
4.1 创建一个 Scrapy 项目
在任意位置创建一个Scrapy项目,执行以下命令:
scrapy startproject myproject
这将在当前目录创建一个名为myproject的文件夹,其中包含初始的Scrapy项目结构。
4.2 编写爬虫代码
在myproject/spiders/下可以创建一个python文件,来编写具体的爬虫实现。例如,我们创建一个名字为quotes_spider.py的文件,输入以下代码:
import scrapy
class QuotesSpider(scrapy.Spider):
name = "quotes"
start_urls = [
'http://quotes.toscrape.com/page/1/',
'http://quotes.toscrape.com/page/2/',
]
def parse(self, response):
for quote in response.css('div.quote'):
yield {
'text': quote.css('span.text::text').get(),
'author': quote.css('span small::text').get(),
'tags': quote.css('div.tags a.tag::text').getall(),
}
这个爬虫会访问http://quotes.toscrape.com/page/1/和http://quotes.toscrape.com/page/2/等页面,从页面中提取名人名言和标签信息。
4.3 运行爬虫
在myproject目录下,执行以下命令:
scrapy crawl quotes
其中,quotes是spider的名字,我们在爬虫代码中定义了。
4.4 数据存储
Scrapy提供了多种方式保存爬取到的数据,如CSV、JSON、XML等格式,也可以保存到数据库中。我们可以在myproject/settings.py文件中定义。
FEED_URI = 'quotes.json'
FEED_FORMAT = 'jsonlines'
这样我们就可以把爬取到的数据保存到quotes.json文件中。
5. Scrapy的扩展
Scrapy还支持多种扩展,如middlewares、extensions、pipelines等。其中middlewares可以在请求的过程中进行拦截处理,extensions可以监听Scrapy的一些事件并进行处理。pipelines是用于处理爬虫数据的流程,我们可以编写多个Pipeline来实现数据的处理。
6. 实例
下面是一个爬取简书网站的文章的爬虫示例。
import scrapy
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule
from urllib.parse import urlparse
class JianshuItem(scrapy.Item):
title = scrapy.Field()
author = scrapy.Field()
content = scrapy.Field()
avatar = scrapy.Field()
pub_time = scrapy.Field()
class JianshuSpider(CrawlSpider):
name = 'jianshu'
allowed_domains = ['jianshu.com']
start_urls = ['https://www.jianshu.com/']
rules = (
Rule(LinkExtractor(allow=r'/p/.*'), callback='parse_item', follow=True),
)
def parse_item(self, response):
item = JianshuItem()
item['title'] = response.xpath('//h1/text()').extract_first().strip()
item['author'] = response.xpath('//span[@class="name"]/a/text()').extract_first()
item['content'] = ''.join(response.xpath('//article/p/text()').extract())
item['avatar'] = response.xpath('//a[@class="avatar"]/img/@src')
item['pub_time'] = response.xpath('//span[@class="publish-time"]/text()').extract()
return item
以上就是简单的Scrapy爬虫示例。我们看到,使用Scrapy可以快速地创建一个爬虫并进行数据的解析和处理。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:一文读懂python Scrapy爬虫框架 - Python技术站