下面我将为你详细讲解“Python爬虫基础之初次使用scrapy爬虫实例”的完整攻略。
什么是Scrapy
Scrapy是一个基于Python的高级网络爬虫框架,其可用于爬取各种网站,并从中抽取出结构化数据。使用Scrapy可以快速方便地实现对目标网站的数据抓取,甚至是高级的数据抽取,加速WEB爬取的研究与开发。
Scrapy的安装和使用
使用scrapy实现爬虫,需要安装首先Scrapy。可以通过pip在命令行中直接安装Scrapy:
pip install scrapy
创建一个Scrapy爬虫
假设我们想要从一个名为MySpider的网站上抽取出结构化数据,可以按照以下步骤创建一个基本的Scrapy爬虫:
-
创建项目: 创建一个新的Scrapy项目可以通过以下命令完成:
scrapy startproject MySpider
此命令将在当前目录中创建一个名为MySpider的目录,其中包含必要的文件和代码。
-
定义Item: 在MySpider项目中,我们需要定义Item类来抽取结构化数据,示例代码如下:
```
import scrapyclass MyItem(scrapy.Item):
title = scrapy.Field()
link = scrapy.Field()
desc = scrapy.Field()
```在这个例子中,我们定义了一个名为MyItem的类,其中包含三个抽取的属性:title、link和desc。
-
编写Spider: 这是本例中最重要的部分。我们需要为我们的爬虫定义一个Spider。这个Spider必须继承“scrapy.Spider”类,并且需要定义一个名为“name”的属性和一个“start_urls”属性。根据页面结构和需要抽取的数据,我们还可以定义其他属性和方法。下面是一个非常基本的Spdier示例:
```
import scrapyclass MySpider(scrapy.Spider):
name = "myspider"
allowed_domains = ["example.com"]
start_urls = [
"http://www.example.com/1.html",
"http://www.example.com/2.html",
"http://www.example.com/3.html",
]def parse(self, response): for sel in response.xpath('//ul/li'): item = MyItem() item['title'] = sel.xpath('a/text()').extract() item['link'] = sel.xpath('a/@href').extract() item['desc'] = sel.xpath('text()').extract() yield item
```
在此示例中,我们定义了一个名为MySpider的Spider,它会通过“allowed_domains”属性指定爬取的域名,并通过“start_urls”属性定义Spider开始爬取的URL。在“parse”方法中,我们对每个从URL中获取的response循环进行处理,并使用XPath表达式来从response中抓取数据。最后,我们将数据存储到刚刚定义的Item对象中,并在每个item对象上调用“yield item”语句来生成结果。
-
运行Spider: 最后,我们可以通过以下命令启动刚刚定义的Spider:
scrapy crawl myspider
这个命令将启动Spider并开始抓取数据。
Scrapy的实例说明
下面,我将举两个scrapy实例来说明Scrapy的使用示例。
实例1:抓取stackoverflow.com的问题
在这个实例中,我们将爬取stackoverflow.com上的问题,并抽取出问题的标题、链接和描述。以下是在Scrapy项目源文件中定义的代码:
import scrapy
class StackSpider(scrapy.Spider):
name = "stack"
allowed_domains = ["stackoverflow.com"]
start_urls = ["https://stackoverflow.com/questions?sort=votes"]
def parse(self, response):
questions = response.xpath('//div[@class="question-summary"]')
for question in questions:
item = StackItem()
item['title'] = question.xpath('div[@class="summary"]/h3/a/text()').extract_first()
item['link'] = question.xpath('div[@class="summary"]/h3/a/@href').extract_first()
item['desc'] = question.xpath('div[@class="summary"]/div[@class="excerpt"]/text()').extract_first()
yield item
在这个实例中,我们可以看到用“//div[@class='question-summary']”来定位问题元素。然后在每个问题中通过XPath表达式抽取问题的标题,链接和描述。注意,我们将这些值存储到名为StackItem的Item对象中。
实例2:抓取嵌套页面中的产品
在这个实例中,我们将爬取“quotes.toscrape.com”上的名言,并抽取作者、标签和名言的完整文本。这个网站的每一页都包含10个名言,但是可以通过其下一页链接来访问更多名言。以下是Scrapy项目中定义的代码:
import scrapy
class QuoteSpider(scrapy.Spider):
name = "quote"
allowed_domains = ["quotes.toscrape.com"]
start_urls = ["http://quotes.toscrape.com"]
def parse(self, response):
quotes = response.xpath('//div[@class="quote"]')
for quote in quotes:
item = QuoteItem()
item['text'] = quote.xpath('span[@class="text"]/text()').extract_first()
item['author'] = quote.xpath('span/small/text()').extract_first()
item['tags'] = quote.xpath('div[@class="tags"]/a/text()').extract()
yield item
next_page = response.xpath('//li[@class="next"]/a/@href').extract()
if next_page:
next_url = response.urljoin(next_page[0])
yield scrapy.Request(next_url, callback=self.parse)
在这个实例中,我们可以看到用“//div[@class='quote']”来定位名言元素。然后在每个名言中通过XPath表达式抽取名言的作者,标签和文本。注意,我们将这些值存储到名为QuoteItem的Item对象中。
然后我们通过在response中寻找下一页链接,来递归爬取更多名言。我们将这个URL作为新的Request对象使用,并使用“self.parse”作为回调函数,以便在新的response中继续递归。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python爬虫基础之初次使用scrapy爬虫实例 - Python技术站