一、安装所需包
1、首先安装scrapy包:pip install scrapy
2、在windows系统下,还需安装pypiwin32这个包:pip install pypiwin32
二、创建项目
1、命令行操作
- 进入指定盘:比如要进入D盘:在命令行输入: d: 或 D: 即可
- 进入指定文件夹:cd+文件名
- 查看指定文件夹下的子文件目录:cd+文件名+dir
- 在某文件下创建文件夹:mkdir+需要创建的文件名称
- 创建scrapy项目:scrapy startproject [项目名称]
2、创建项目和爬虫:(在命令行中的操作)
- 创建项目:‘scrapy startproject[爬虫的名字]’.
- 创建爬虫:进入到项目所在的路径,执行命令:‘scrapy genspider[爬虫名字][爬虫的域名]’.注意,爬虫名字不能和项目名称一致。
- 通过命令行运行爬虫:scrapy crawl [爬虫名字]
3、项目目录结构:
- items.py:用来存放爬虫爬取下来数据的模型
- middlewares.py:用来存放各种中间件的文件
- pipelines.py:用来将items的模型存储到本地磁盘中
- settings.py:本爬虫的一些配置信息(比如请求头,多久发送一次请求,ip代理池等)
- scrapy.cfg:项目的配置文件
- spiders包:以后所有的爬虫,都是存放在这个里面
4、在pycharm创建.py文件代替cmd命令行运行scrapy项目
- 在cmd创建好scrapy项目后,在pycharm找到创建的项目并打开,在scrapy项目根目录下创建一个py文件,代替cmd运行爬虫项目
- 在py文件输入:from scrapy import cmdline
- cmdline.execute("scrapy crawl [爬虫名字]”).split()或cmdline.execute(['scrapy','crawl','[爬虫名字]')
- 由于cmdline.execute需要传入列表字符串的格式,所以需要用.split()函数或直接传入列表字符串的形式。
5、糗事百科scrapy爬虫笔记:
- response是一个‘scrapy.htttp.response.html.HtmlResponse’对象,可以执行'xpath'和‘css’语法来提取数据
- 读取出来的数据,是一个‘selector’或者是一个‘selectorlist’对象,如果想要获取其中的字符串,那么应该执行‘getall’或者‘get’方法
- getall方法:获取‘selector’中的所有文本,返回的是一个列表
- get方法:获取的是‘selector’中的第一个文本,返回的是一个str类型。
- 如果数据解析回来,要传给pipeline处理,那么可以使用‘yield’生成器来返回,或者是创建列表,收集所有的item,最后使用return返回。
- item:建议在‘items.py’中定义好模型,以后就不要使用字典。
- pipeline:这个是专门用来保存数据的,其中有三个方法是会经常使用的,
- ‘open_spider(self,spider)’:当爬虫被打开的时候执行
- ‘process_item(self,spider)’:当爬虫有item传过来的时候会被调用
- 'close_item(self,spider)':当爬虫关闭的时候会被调用
- 要激活pipeline,应该在‘settings.py’中设置‘ITEM_PIPELINES’示例如下:
- ITEM_PIPELINES = {'qsbk.pipelines.QsbkPipeline': 300,}
6、JsonItemExporter和JsonLinesItemExporter
- 保存json数据的时候,可以使用这两个类,让操作变得更简单
- 1、JsonItemExporter:这个是每次把数据添加到内存中,最后统一写入到磁盘中,好处是存储的数据是一个满足json规则的数据,坏处是如果数据量大,比较耗内存
- 示例代码如下:
- from scrapy.exporters import JsonItemExporter
- class QsbkPipeline(object): # def __init__(self):
- self.fp=open("duanzi.json",'wb') self.exporter=JsonItemExporter(self.fp,ensure_ascii=False,encoding='utf-8') self.exporter.start_exporting() #def open_spider(self,spider): print('pachongkaishil') # def process_item(self,item,spider): self.exporter.export_item(item) return item def close_spider(self,spider): self.exporter.finish_exporting() self.fp.close() print('pachongjieshul')
- 示例代码如下:
- 2、JsonLinesItemExporter:这个是每次调用‘export_item’的时候把这个item存储到硬盘中,坏处是每一个字典是一行,整个文件不是一个满足json格式的文件,好处是每次处理数据的时候就直接存储到了硬盘中,不会耗内存,数据也比较安全。
- 示例代码如下:
- from scrapy.exporters import JsonLinesItemExporter
- class QsbkPipeline(object):
- def __init__(self):
- self.fp=open('duanzi.json','wb')
- self.exporter=JsonLinesItemExporter(self.fp,ensure_ascii=False,encoding='utf-8')
- def open_spider(self,spider):
- print('pachongkaishil')
- def process_item(self,item,spider):
- self.exporter.export_item(item)
- return item
- def close_spider(self,spider):
- self.fp.close()
- print('pachongjieshul')
- 示例代码如下:
7、CrawlSpider:
- 在cmd创建爬虫的时候,输入:scrapy genspider -t crawl [爬虫名字,是指需要在里面写网页详情页面爬取的py文件] ["域名"]
- 需要使用‘LinkExtractor’和‘Rule’,这两个东西决定爬虫的具体走向
- allow设置规则的方法:要能够限制在我们想要的url上面,不要跟其他的url产生相同的正则表达式 即可
- 什么情况下使用follow:如果在爬取页面的时候,需要将满足当前条件的url在进行跟进,那么就设置为True,否则设置为False
- 什么情况下改指定callback:如果这个url对应的页面,只是为了获取更多的url,并不需要里面的数据,那么可以不指定callback,如果想要获取url对应页面中的数据,那么就需要指定一个callback