写一个爬虫,需要做很多的事情。比如:发送网络请求、数据解析、数据存储、反反爬虫机制(更换p代理、设置请求头等)、异步·请求等。
这些工作如果每次都要自己从零开始写的话,比较浪费时间。因此Scrapy把一些基础的东西封装好了,在他上面写爬虫可以变的更加的高效(肥取效率和开发效率)
。因此真正在公司里,一些上了量的爬虫,都是使用scrapy框架来解决。
scrapy
:通过pip install scrapy
即可安装。pypiwin32
,如果不安装,那么以后运行scrapy项目的时候就会报错。安装方式:pip install pypiwin32
。sudo apt-get install python-dev python-pip libxml2-dev libxslt1-dev zlib1g-dev libffi-dev libssl-dev
。scrapy startproject [爬虫的名字]
。scrapy genspider [爬虫名字] [爬虫的域名]
。注意,爬虫名字不能和项目名称一致。scrapy.http.response.html.HtmlResponse
对象。可以执行xpath
和css
语法来提取数据。Selector
或者是一个SelectorList
对象。如果想要获取其中的字符串。那么应该执行getall
或者get
方法。Selector
中的所有文本。返回的是一个列表。Selector
中的第一个文本。返回的是一个str类型。yield
来返回。或者是收集所有的item。最后统一使用return返回。items.py
中定义好模型。以后就不要使用字典。open_spider(self,spider)
:当爬虫被打开的时候执行。process_item(self,item,spider)
:当爬虫有item传过来的时候会被调用。close_spider(self,spider)
:当爬虫关闭的时候会被调用。settings.py
中,设置ITEM_PIPELINES
。示例如下:ITEM_PIPELINES = {
'qsbk.pipelines.QsbkPipeline': 300,
}
保存json数据的时候,可以使用这两个类,让操作变得得更简单。
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('爬虫开始了...')
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('爬虫结束了...')
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('爬虫开始了...')
def process_item(self, item, spider):
self.exporter.export_item(item)
return item
def close_spider(self,spider):
self.fp.close()
print('爬虫结束了...')
scrapy startproject [爬虫的名字]
scrapy genspider -t crawl [爬虫名字] [爬虫的域名]
需要使用LinkExtractor
和Rule
。这两个东西决定爬虫的具体走向。
scrapy shell
命令。scrapy.FormRequest
方法。可以方便的指定表单数据。start_requests
方法。在这个方法中,发送post请求。