首先分析我们要爬取的网页:
https://movie.douban.com/top250
我们要爬取的信息是这些电影的名称,电影相关信息,评分,以及一句话的名言。
这些信息就在网页的主体部分,使用xpath结合chrome的元素定位能很容易的提取到我们想要的信息。
接下来就是使用scrapy框架来编写我们的爬虫了。
在pycharm中,打开setting.py文件,添加一下内容
USER_AGENT = 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) ' \
'Chrome/14.0.835.163 Safari/535.1'
FEED_URI = 'file:///E:/douban/result/douban.csv'
FEED_FORMAT = 'CSV'
user_agent是浏览器的标识,我们使用这个标识伪装我们的爬虫。然而豆瓣实际上并不会阻止爬虫爬取,并且它也是有自己的爬虫访问接口的。
下面的两个参数表示我们要把爬取的数据写入一个csv文件中,文件的地址是
file:///E:/douban/result/douban.csv
然后打开items.py文件,写入以下内容:
from scrapy import Item, Field
class DoubanItem(Item):
# define the fields for your item here like:
# name = scrapy.Field()
title = Field()
movieInfo = Field()
star = Field()
quote = Field()
这是定义我们爬取的内容列表,你可以理解为像数据库创建表一样,定义每一列的名称。
接下来就是爬虫的主题部分了。
在spiders文件夹下创建一个doubanSpider.py文件,写入以下内容
from scrapy.contrib.spiders import CrawlSpider
from scrapy.http import Request
from scrapy.selector import Selector
from douban.items import DoubanItem
class Douban(CrawlSpider):
name = 'douban'
redis_key = 'douban:start_urls'
start_urls = ['https://movie.douban.com/top250']#起始链接,爬虫的入口链接
url = 'https://movie.douban.com/top250' #基础链接,构造下一页的时候要用到
def parse(self, response):
item = DoubanItem() #实例化Item类,用于保存读取的数据
selector = Selector(response)
Movies = selector.xpath('//div[@class="info"]')#选择电影信息区域
for eachMovie in Movies:
fulltitle = ''
title = eachMovie.xpath('div[@class="hd"]/a/span/text()').extract()#这里和lxml.xpath中不同的地方,需要在末尾加上extract()
for each in title:
fulltitle = fulltitle + each.strip()
Info = eachMovie.xpath('div[@class="bd"]/p/text()').extract()
movieInfo = ''
for i in Info:
movieInfo += i.strip()
star = eachMovie.xpath('div[@class="bd"]/div[@class="star"]/span[2]/text()').extract()
quote = eachMovie.xpath('div[@class="bd"]/p[@class="quote"]/span/text()').extract()
if quote:#quote可能是空的,所以要判断一下
quote = quote[0]
else:
quote = ''
item['title'] = fulltitle
item['movieInfo'] = movieInfo
item['star'] = star
item['quote'] = quote
yield item #python生成器,请自行百度yield了解
nextLink = selector.xpath('//span[@class="next"]/link/@href').extract()#构造下一页的链接
if nextLink:#判断是否到了最后一页
nextLink = nextLink[0]
print(nextLink)
yield Request(self.url + nextLink, callback=self.parse)#循环访问链接。
代码中给出了比较详细的注释了。就不再讲解了。
接下来我们要运行这个程序。
我们可以在命令行中使用scrapy相关命令运行这个爬虫,不够我选择在pycharm中运行。
在douban主目录下创建main.py文件,写入一下内容:
from scrapy import cmdline
cmdline.execute('scrapy crawl douban'.split())
然后右键main.py文件选择Run 'main'选项,就可以运行了。
这样我们就获得了写有电影信息的douban.csv文件了。
我们选择使用excel打开,跟我在bilibili爬虫那一节中讲的一样,我们需要转换一下编码,不然打开中文是乱码。
打开后,你可能会遇到每一列的顺序不一样。也就是电影名称可能并不是第一行。因为在我们用了一个字典保存信息。然而python的字典是无序的,我们也没有像bilibili那节中制定csv写入的顺序。所以就有可能遇到顺序是乱的情况。
我们需要在spiders目录下新建一个itemCsvExporter.py文件,写入以下内容:
from scrapy.conf import settings
from scrapy.contrib.exporter import CsvItemExporter
class itemCsvExporter(CsvItemExporter):
def __init__(self, *args, **kwargs):
delimiter = settings.get('CSV_DELIMITER', ',')
kwargs['delimiter'] = delimiter
fields_to_export = settings.get('FIELDS_TO_EXPORT', [])
if fields_to_export:
kwargs['fields_to_export'] = fields_to_export
super(itemCsvExporter, self).__init__(*args, **kwargs)
在setting中添加以下内容:
FEED_EXPORTERS = {
'csv': 'douban.spiders.itemCsvExporter.itemCsvExporter',
#douban为你的scrapy项目的名字
}
FIELDS_TO_EXPORT = [
'title',
'movieInfo',
'star',
'quote'
]
这样就可以按照上面指定的顺序储存信息了。先删除douban.csv文件,再跑一遍程序,再转码后用excel打开。
可以看到我们的想要的信息已经按照顺序排好了。
不过还有一个问题,每行下都有一个空行。
我们并不需要这个空行。
打开itemCsvExporter.py文件,鼠标选中CsvItemExporter(单击,不要拖动选择),然后按下ctrl+b,打开exporters.py文件,在CsvItemExporter类中新加一行:
删除douban.csv,跑一遍程序,转码,用Excel打开:
中间可以看到有些问号,这是html中的空格的转码问题,可以使用字符串的截取功能,我就不实现了。
好了,到这里就完成了。
由于这个爬虫比较简单,前面代码也已经全部贴出来了,我就不放在github上了。