本次的学习分享主要是使用一次Scrapy框架,毕竟在很多次的时候,自己在提取一些或是需要实验数据的时候,数据量要求不大,很快便能通过简单的request等库进行调用,然后获取数据。
这次,则是想要使用一次Scrapy框架,毕竟如果一次通配使用Scrapy也算是为了以后的学习实验进行提前准备,顺便记录要点,容易出错的地方。
实验环境 | 版本号 |
python | 3.6.3 |
Scrapy | 1.5.1 |
最基本的环境要求,本次实验使用Pycharm进行实践,而不是简单使用cmd这块黑黑的面板进行操作,因为实在是太麻烦了,再者那就是如果你已经有了一定的基础了,那么完全可以直接使用IDEA进行一些操作,省时省力,也差不了多少。并且如果你需要设置的Scrapy新项目的位置不在其他地方,打开pycharm的终端之后,你就会发现,当前路径已经是到了你项目路径下!
第一步:设置启动一个新的Scrapy项目!
1.打开pycharm,打开底部的终端。
如图所示。
2.将当前的路径下键入 以下命令!
scrapy startproject <scrapyProjectName>
其中的scrapyProjectName就是你要设置的项目名称,很重要,因为之后的启动爬虫项目,也是必须要用这个名称,在这里,既然是以豆瓣的电影为目标数据集,那么就设置本次项目的名称为douban。
scrapy startproject douban
结果生成了如下的项目结构!
第二步:根据第一步当中的友好提示,设置Spider啦!
这一步也很简单,看见./douban/douban/spiders路径没,大家是否注意过,这个地方的spiders文件夹名称是叫做spiders,嗯复数哦!意味着,其实我们的爬虫也就是我们的蜘蛛其实是可以设计很多个的,但是现在我们只要爬虫电影数据,那么好了,我们就设置一个名称为movie的spider吧!
语法结构可是在第一步的第二张图告诉我们的!
依旧是在终端位置输入!
cd douban
scrapy genspider movie movie.douban.com --template=crawl
以上的movie就是我们设置的spider的名称,而且大家注意到没还设置了个example.comurl,而这个url其实就是我们spider要爬虫的入口url或者说是入口域名!
结果便是在spiders文件夹下将生成movie.py文件,而这个文件就是我们自定义依照crawl模板生成的spider!
而movie的spider(小蜘蛛)文件生成之后,我们会发现,在这个文件当中,其实最主要的就三个要关注的地方!一个便是start_url,一个就是rules,一个就是parse_item函数!
start_url是我们要爬取数据的页面,在这里,我们就爬取豆瓣的前250电影!
rules当中,要爬取也是规则也是在这个页面下操作的!
以及对应每次爬取之后的数据要怎么样去获取抽取出来,则就是parse_item的工作!
所以以下的movie.py当中的代码如下:
# -*- coding: utf-8 -*-
import scrapy
from scrapy.selector import Selector
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule
from douban.items import DoubanItem
class MovieSpider(CrawlSpider):
name = 'movie'
allowed_domains = ['movie.douban.com']
start_urls = ['https://movie.douban.com/top250']
rules = (
Rule(LinkExtractor(allow=(r'https://movie.douban.com/top250\?start=\d+.*'))),
Rule(LinkExtractor(allow=(r'https://movie.douban.com/subject/\d+')), callback='parse_item'),
)
def parse_item(self, response):
sel = Selector(response)
item = DoubanItem()
item['name']=sel.xpath('//*[@id="content"]/h1/span[1]/text()').extract()
item['year']=sel.xpath('//*[@id="content"]/h1/span[2]/text()').re(r'\((\d+)\)')
item['score']=sel.xpath('//*[@id="interest_sectl"]/div/p[1]/strong/text()').extract()
item['director']=sel.xpath('//*[@id="info"]/span[1]/a/text()').extract()
item['classification']= sel.xpath('//span[@property="v:genre"]/text()').extract()
item['actor']= sel.xpath('//*[@id="info"]/span[3]/a[1]/text()').extract()
return item
以上有很重要的位置便是rules的设置,这部分的设置,使用回调函数,只有第二个链接才进行使用,可以查看下豆瓣的电影某条路径,你就可以知道为什么只设置了第二条进行回调函数parse_item,而第一条没有呢!
因为第一条是整个一页面!
而第二条则是某一条目的具体定位,只能通过第二条来页面当中某一条目的所有信息!!
(当然以上的写法主要是使用了r开头的regex也就是正则匹配!实在是太强大了是不是哈哈!)
注意到此代码其实是引入了Scapy项目当中的items,items其实就是我们生成的数据当中的域,其域有多个文件属性名,类似json的数据结构&#