实例方法, 静态方法, 类方法的区别
实例方法: 类中定义的普通方法,只能通过实例对象调用
静态方法: 静态方法主要是用来存放逻辑性的代码,逻辑上类型属于这个类,但是和类本身没有关系,实例对象和类对象都可以
调用
类方法的区别:假设有个方法,且这个方法在逻辑上采用类本身作为对象来调用更合理,那么这个方法就可以定义为类方法。另外,如果需要继承,也可以定义为类方法,实例对象和类对象都可以调用
使用分布式必须要安装: pip install scrapy-redis
分布式:
分布式爬虫的难点在于多台机器之间怎么互相通信而防止爬取重复的url,解决办法就是使用内存型数据库redis,
在redis中创建一个列表,列表用于记录爬取过的url, 每台机器在爬取之前都访问该数据库,看将要爬取的url是否在redis
数据库中,如果在的话就不再进行爬取。
生成爬虫可以不加模板,不加模板的话就不会出现rules,需要自己写
起始url不写在项目中,写在redis数据库中
索引页要follow,国家内容不follow,但是有callback
from scrapy_redis.spiders import RedisCrawlSpider
引入需要的模块,爬虫模块继承的类需要改成RedisCrawlSpider
如果出现填一个url才能爬取一个url,不能自动爬取的话首先看一下域名是否正确,如果实在不行的话就把redis数据库
清空一下(flushdb),可能是由于存储爬取过的url那个列表的上次运行缓存太多造成的
使用分布式需要使用redis数据库,在终端连接redis数据库的命令是 redis-cli
需要在redis数据库中插入第一个url:
lpush start_urls http://example.webscraping.com/places/default/index/1
如果报错:
TypeError: 'ItemMeta' object does not support item assignment
说明爬虫模块引入的Item模块中定义的类的名字不对,或者是引用过来少带了括号。
打开文件最常用的有两种方式:
1. 文本文件不需要用wb, 可以直接存储,如果加了wb, 下面写入的过程还需要encode('utf8'),图片,音频视频存为不同类型的文件时一定要加wb, 不同类型的文件后缀名不一样,可以采用字符串拼接的方式直接将爬出数据的名字定义为文件名,如:
(file = item['aname'] + '.txt'), (pic = item['aname'] + '.jpg')
1.第一种存储过程
f = open(file, 'w')
f.write((item['aname']+','+item['atype'] + '\n'))
f.close()
with open的方式打开不用关系关闭因为with open用完会自动关闭:
2.第二种存储过程
with open(file,'w',encoding='utf8') as f:
f.write((item['aname']+','+item['atype'] + '\n'))
f.close()
scrapy存储图片:
with open(pic, 'wb') as p:
p.write(requests.get(item['aimage']).content)
p.close()
同时可以指定打开某个路径下的文件或者保存到某个路径下,如果不指定的话默认就是相对路径的当前的目录下:
如果使用/来表示路径可以直接写绝对路径,如果使用\则需要在绝对路径的前面加r来表示不转义,以原字符解释, 路径的
最后一定要加/表示最后那个文件下:
with open('G:/第四阶段/11月9日AnimalSpider/Animal/data/'+file,'w',encoding='utf8') as f:
f.write((item['aname']+','+item['atype'] + '\n'))
f.close()
with open(r'G:\第四阶段\11月9日AnimalSpider\Animal\data/'+file,'w',encoding='utf8') as f:
f.write((item['aname']+','+item['atype'] + '\n'))
f.close()