标题:使用Scrapy爬取豆瓣电影TOP250
在本文中,我们将使用Python的爬虫框架Scrapy来抓取豆瓣电影TOP250的信息。Scrapy是一个高效且易于使用的Web爬虫框架,可以帮助我们快速地从网络上抓取所需要的信息。
在命令行中输入以下命令,创建一个Scrapy项目:
scrapy startproject douban_top250
这个命令会创建一个名为“douban_top250”的目录,其中包含了Scrapy的一些基本文件和目录。
在Scrapy的术语中,Spider是一个可以定义如何请求页面、抓取数据的类。我们需要创建一个Spider来告诉Scrapy如何抓取豆瓣电影TOP250。
在“douban_top250”目录中,创建一个名为“spiders”的子目录,然后在这个子目录中创建一个名为“douban_spider.py”的Python文件。这个文件中包含以下代码:
import scrapy
class DoubanSpider(scrapy.Spider):
name = 'douban'
allowed_domains = ['movie.douban.com']
start_urls = ['https://movie.douban.com/top250']
def parse(self, response):
# TODO
这个Spider的名称是“douban”,目标网站是“movie.douban.com”,初始请求的URL是“https://movie.douban.com/top250”。在“parse”方法中,我们将定义如何抓取页面并提取所需要的数据。
在“parse”方法中,我们将使用XPath表达式来定位HTML页面中的各种元素,并提取出所需要的数据。例如,以下代码可以提取页面中的电影名、评分和导演信息:
def parse(self, response):
for movie in response.xpath('//div[@class="info"]'):
yield {
'title': movie.xpath('div[@class="hd"]/a/span[@class="title"]/text()').extract_first(),
'rating': movie.xpath('div[@class="bd"]/div[@class="star"]/span[@class="rating_num"]/text()').extract_first(),
'director': movie.xpath('div[@class="bd"]/p[1]/text()').extract_first().strip().split(':')[1]
}
这个代码将遍历页面中所有的电影,用Python的字典类型表示每一部电影的信息,并将它们“yield”出来,以方便后续处理。
默认情况下,Scrapy将会将抓取到的数据输出到标准输出中。我们可以将其存储到CSV或JSON文件中,以便后续处理。
在“douban_top250”目录中,创建一个名为“pipelines.py”的Python文件,并添加以下代码:
import csv
class CsvPipeline(object):
def __init__(self):
self.file = open('douban_top250.csv', 'w', newline='')
self.writer = csv.writer(self.file)
self.writer.writerow(['title', 'rating', 'director'])
def process_item(self, item, spider):
self.writer.writerow([item['title'], item['rating'], item['director']])
return item
def __del__(self):
self.file.close()
这个代码创建了一个名为“CsvPipeline”的管道,用于将抓取到的数据存储到CSV文件中。
最后,在“douban_top250”目录中的“settings.py”文件中添加以下代码:
ITEM_PIPELINES = {
'douban_top250.pipelines.CsvPipeline': 300,
}
这个代码将我们刚才创建的“CsvPipeline”管道添加到Scrapy的数据处理管道中。
最后,在命令行中输入以下命令,运行我们刚才创建的Spider:
scrapy crawl douban
这个命令将会启动Scrapy的爬虫引擎,然后依次抓取每个页面,并将提取到的数据存储到CSV文件中。
在“parse”方法中,我们可以使用XPath表达式来提取HTML页面中的元素。例如,以下代码可以提取页面中的电影名和评分:
def parse(self, response):
for movie in response.xpath('//div[@class="info"]'):
yield {
'title': movie.xpath('div[@class="hd"]/a/span[@class="title"]/text()').extract_first(),
'rating': movie.xpath('div[@class="bd"]/div[@class="star"]/span[@class="rating_num"]/text()').extract_first(),
}
这个代码将遍历页面中所有的电影,用Python的字典类型表示每一部电影的信息,并将它们“yield”出来,以方便后续处理。
可以将抓取到的数据存储到MongoDB数据库中。在“douban_top250”目录中的“pipelines.py”文件中,添加以下代码:
import pymongo
class MongoPipeline(object):
def __init__(self):
self.client = pymongo.MongoClient('mongodb://localhost:27017/')
self.db = self.client['douban_top250']
self.collection = self.db['movies']
def process_item(self, item, spider):
self.collection.insert(item)
return item
def __del__(self):
self.client.close()
这个代码创建了一个名为“MongoPipeline”的管道,用于将抓取到的数据存储到MongoDB数据库中。在“settings.py”文件中,添加以下代码:
ITEM_PIPELINES = {
'douban_top250.pipelines.MongoPipeline': 300,
}
这个代码将我们刚才创建的“MongoPipeline”管道添加到Scrapy的数据处理管道中。注意需要提前安装pymongo库。
本文链接:http://task.lmcjl.com/news/7099.html