Python爬虫Scrapy基本使用超详细教程
简介
Scrapy是Python编写的一个Web爬虫框架,基于Twisted异步网络库开发,可以加速爬虫的速度,同时支持XPath, CSS选择器等方式解析页面内容,底层支持分布式部署,可以实现高并发爬虫。
安装Scrapy
可以使用pip安装Scrapy:
pip install scrapy
也可以从Scrapy官网下载源码安装:
git clone https://github.com/scrapy/scrapy.git
cd scrapy
python setup.py install
创建项目
使用命令创建一个新的Scrapy项目:
scrapy startproject myproject
其中myproject是项目的名称。
在创建完项目后,进入项目目录,可以看到如下的文件结构:
myproject/
scrapy.cfg
myproject/
__init__.py
items.py
middlewares.py
pipelines.py
settings.py
spiders/
__init__.py
其中:
- scrapy.cfg:Scrapy项目的配置文件;
- myproject:项目的Python模块,实际项目的代码放在这个目录下;
- items.py:定义爬取的数据结构;
- middlewares.py:定义的Scrapy中间件;
- pipelines.py:定义的Scrapy管道,用于处理数据;
- settings.py:项目的配置文件;
- spiders:爬虫目录,存放所有爬虫代码。
定义爬虫
在spiders
目录下创建一个新的文件,命名为spider.py
,定义一个简单的爬虫:
import scrapy
class MySpider(scrapy.Spider):
name = 'myspider'
start_urls = ['http://example.com']
def parse(self, response):
yield {
'title': response.css('title::text').extract_first(),
'body': response.css('body::text').extract_first()
}
在代码中,创建一个名为MySpider
的爬虫类,指定了爬虫的名称为myspider
,并指定了爬取的起始网址。parse()
方法用于解析并处理抓取到的页面,返回一个字典对象。
运行爬虫
在终端中使用scrapy crawl
命令运行爬虫:
scrapy crawl myspider
其中myspider
为自定义的爬虫名称。运行后,Scrapy会自动执行parse()
方法,并将结果输出到控制台上。
示例1:爬取热门书籍
接下来,我们用Scrapy爬取豆瓣热门图书信息,比如书名、作者、评分等。该爬虫的代码如下:
import scrapy
class BookSpider(scrapy.Spider):
name = "book"
allowed_domains = ["book.douban.com"]
start_urls = [
"https://book.douban.com/top250"
]
def parse(self, response):
for book in response.css('tr.item'):
yield {
'title': book.css('div.pl2 a::text').extract_first(),
'author': book.css('p.pl::text').extract_first(),
'rating': book.css('span.rating_nums::text').extract_first()
}
next_page = response.css('span.next a::attr(href)').extract_first()
if next_page is not None:
yield response.follow(next_page, self.parse)
在代码中,我们定义了一个名为BookSpider
的爬虫类。在parse()
方法中,使用response.css
方法选取页面元素,返回结果为SelectorList对象,使用extract_first()
方法提取第一个匹配的内容,并构造一个字典对象返回。
接着,使用response.follow()
方法处理翻页,如果存在下一页,则继续调用parse()
方法爬取。
示例2:递归爬取网站所有页面
在实际爬取过程中,我们需要递归地爬取一个网站上的所有页面,可以使用Scrapy的CrawlSpider实现。下面是一个从start_urls开始递归地爬取网站上所有页面的爬虫代码:
import scrapy
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule
class MySpider(CrawlSpider):
name = 'myspider'
allowed_domains = ['example.com']
start_urls = ['http://www.example.com/']
rules = [
Rule(LinkExtractor(), callback='parse_item', follow=True)
]
def parse_item(self, response):
yield {
'url': response.url,
'title': response.css('title::text').extract_first(),
'body': response.css('body::text').extract_first()
}
在代码中,我们使用CrawlSpider
作为基类,并定义了一个简单的规则。LinkExtractor
用于提取链接,Rule
表示如何处理链接。在parse_item()
方法中,解析页面并返回内容。
链接
本文参考了Scrapy的官方文档和教程。