以前一直用的网页级爬虫库(request),爬取了很多东西,12306余票,全国高校对四川招生,文章,图片等,不是说request不好才来学scrapy的,它们各有各自的优点和使用的场景。下面小小总结一下两者的区别:request网页级爬虫,爬取速度较慢,但是写出来的逻辑容易理解,也比较简单,适合爬虫初学者,而scrapy是一个系统的框架,功能全面,异步爬取,速度快,但是理解起来较难,不太适合新手入门,而且官网的scrapy中文文档看了,也未必能够理解scrapy框架....建议从request入门,理解爬虫的原理,再去学scrapy框架。
scrapy中文官方文档:https://scrapy-chs.readthedocs.io/zh_CN/latest/index.html
scrapy常用命令:
一:新建一个项目:
win+r cmd后 ,scrapy startproject +项目名 或者 在pycharm 的命令窗口一下也可以,因为用的pycharm
就在pycharm命令串口下命令的。
然后pycharm里面会自动生成一系列文件和配置文件以及文件夹,目录结构如下:
二:生成爬虫文件:scrapy genspider +爬虫名 +爬取的域名
在命令窗口执行: scrapy genspider doubanspider 生成一个名为doubanspider的爬虫文件
在spider文件下会有个doubanspider文件:
三:运行爬虫 scrapy crawl +spider下的爬虫文件名
命令窗口下:scrapy crawl doubandspider 运行如下有报403错:
需要把浏览器信息user-agent加上,在setting里面把user-agent注释取消,并且把user-agent浏览器信息加上。
user-agent信息在浏览器豆瓣电影F12开发者模式 ,刷新,然后点击network,在all里面随便点个文件,有很多请求信息,在request header 里面把user-agent复制下,粘贴到setting里面。
再次运行 scrapy crawl doubanspider:会显示rebot爬虫协议问题,在setting里面把
ROBOTSTXT_OBEY = True改为 ROBOTSTXT_OBEY = False 表示不遵守网站的reboot协议
四:打开items.py文件,在doubanmovieItem下定义item容器,方便数据存取,以及数据库的表的建立(和django中的module相似)
# -*- coding: utf-8 -*-# Define here the models for your scraped items## See documentation in:# /en/latest/topics/items.htmlimport scrapyclass DoubanmovieItem(scrapy.Item):# define the fields for your item here like:# name = scrapy.Field()serial_number=scrapy.Field()#序号movie_name=scrapy.Field()#电影名称introduce=scrapy.Field()#电影介绍star_score=scrapy.Field()#评分comments=scrapy.Field()#评论describe=scrapy.Field()#电影描述
五:把doubanspider编写完成
提取方法用的是xpath(真的很简单,菜鸟教程中等等都可以学习,很快就会掌握,scrapy shell练习方便理解掌握),还有很多其他提取方法,re,css(也很简单,标准的html规范),bs4等
菜鸟教程xpath教程:/xpath/xpath-tutorial.html
# -*- coding: utf-8 -*-import scrapyfrom ..items import *class DoubanspiderSpider(scrapy.Spider):name = 'doubanspider' #爬虫名字,名字必须唯一allowed_domains = [''] #爬取的域名,只允许爬取列表内的域名,为空则允许爬取所有域名start_urls = ['/top250']#入口url#默认解析方法def parse(self, response):movie_list=response.xpath('//div[@class="article"]//ol//li')#xpath提取所有电影都在li标签这中item=DoubanmovieItem()#item容器导入for movie in movie_list:item['serial_number']=movie.xpath('.//em/text()').extract_first()#提取em标签中的序号item['movie_name']=movie.xpath('.//span[@class="title"][1]/text()').extract_first()#提取span标签中电影名字temp=movie.xpath('.//div[@class="info"]//p[1]/text()').extract()infos=""for info in temp:infos+="".join(info.split())#去掉介绍里面空格以及换行item['introduce']=infos#提取电影介绍item['star_score']=movie.xpath('.//div[@class="star"]//span[@class="rating_num"]/text()').extract_first()#提取评分item['comments_num']=movie.xpath('.//div[@class="star"]//span[4]/text()').extract_first()#评论人数item['describe']=movie.xpath('.//p[@class="quote"]//span/text()').extract_first()#电影描述yield item#next_url=response.xpath('//span[@class="next"]/link/@href').extract_first()if next_url:yield scrapy.Request("/top250"+next_url,callback=self.parse)
六:运行爬虫 scrapy crawl +爬虫名
scrapy scrawl doubanspider 就能运行这个爬虫,会看到爬取的数据,以及显示的爬取状态,请求次数,深度,响应次数,调度次数....不得不说相比request scrapy真的很快
温馨提示:在命令窗口不怎么方便观察,可以在运行爬虫的命令后面追加 -o 文件名.后缀格式(.csv.json等)
eg:scrapy crawl doubanspider -o bandou.csv
运行结束后,点击一下爬虫文件,就会看到有个保存的文件,如下:
在csv文件里面,最上面一行,是我们在item定义的字段,每一个字段对应一列内容,知识没有对齐,可以看到倒数第二列就是序号,翻到csv文件最后,看最后一行倒数第二列,可以看到序号为250说明,我们爬取的数据都保存完毕,爬取十分成功!