scrapy使用心得(入门教程)

    xiaoxiao2022-06-26  194

    scrapy官网:https://doc.scrapy.org/en/latest/topics/settings.html

    基本上没有什么教程可以媲美官方文档的,所有的教程不过是在解读官方文档。所以,如果你有耐心的话可以自己看官方文档。使用谷歌浏览器自带的谷歌翻译可以看得懂,不像python官方的文档,机翻出来基本天书。

    关于各组件的功能,我觉得这个博客写的很好。可以看一下https://www.cnblogs.com/kongzhagen/p/6549053.html

    安装指南

    如果只是参考文档的做,绝对会报错。这个还是需要百度搜一下相关文章,他们会提供简单的安装方法。

    [Scrapy初识]

    (https://doc.scrapy.org/en/latest/intro/tutorial.html)

    这个主要在讲解scrapy怎么爬取quotes.toscrape.com这个网站

    首先创建项目:scrapy startproject tutorial。命令行执行,如果是Windows则是dos下执行,这条命令会创建一个scrapy文件目录。目录结构先不理他,我们先在spiders目录创建一个爬虫文件,名称随意,比如就叫spider.py。在spider.py写入以下内容 import scrapy class QuotesSpider(scrapy.Spider): name = "quotes" def start_requests(self): urls = [ 'http://quotes.toscrape.com/page/1/', 'http://quotes.toscrape.com/page/2/', ] for url in urls: yield scrapy.Request(url=url, callback=self.parse) def parse(self, response): page = response.url.split("/")[-2] filename = 'quotes-%s.html' % page with open(filename, 'wb') as f: f.write(response.body) self.log('Saved file %s' % filename)

    4.然后,在dos窗口cd到scrapy.cfg所在的目录,输入scrapy crawl quotes。 5.这样,一个简单的使用就完成了,我们所做的只是写了一些解析网页的代码。至于怎么抓取完全由scrapy来操作。

    我们来说明以下我们写的那个文件的信息。

    文件名随意,如果整个scrapy只是抓取一个网站建议命名为spider.py。如果抓取多个网站可以用网站域名区分。继承于scrapy.Spider,必须继承scrapy下的爬虫类,一般是scrapy.Spidername属性,爬虫的名称,运行的时候使用,比如上面的第四步命令的最后就是这个name的值start_requests方法,默认调用的一个方法,主要写爬虫抓取的网站parse方法,解析函数,接受一个response对象,这个对象是爬虫爬取网页生成的一个对象,包含网页结构。主要用于提取想要的数据

    命令行工具

    说一下我觉得有用的几个命令

    创建项目:scrapy startproject baidu创建爬虫:scrapy genspider spider www.baidu.com运行爬虫:scrapy crawl name [-o a.json]检查项目:scrapy check -l访问网页:scrapy view url测试提取:scrapy shell url查看版本:scrapy version [-v]

    这没什么需要注意的,多用几次就知道是什么意思了。测试提取是在命令行解析数据,看看你的xpath能不能提取到数据。

    爬虫

    前面粗略的说了一下爬虫的几个属性和方法,现在我们全面一点

    name:(属性,字符串),爬虫名称allowed_domains: (类属性,列表),允许爬取的域名start_urls: (属性,列表),默认开始爬取的URL列表custom_settings:(属性,字典),包含配置信息,用于覆盖setting.py里的配置。比如这个爬虫我要使用特定的头信息等。crawler:看起来功能强大,但只使用过crawler.settings.get获取settings.py里面的配置参数settings:运行此蜘蛛的配置,暂时没弄懂有什么用logger:(属性,怎么说呢),管理日志.使用的话self.logger.info(’’)from_crawler: (类方法),需要加@classmethod修饰。目前已知的作用是获取参数并传递给__init__。不清楚目的如何,为什么不直接通过crawler获取参数。start_requests:(方法),默认调用的一个方法。主要写爬虫爬的网站。parse:(方法),当存在start_urls默认调用的解析函数log:(方法),暂时没用过closed:(方法),爬虫停止时调用的一个方法,一般用于资源的关闭

    以上是scrapy.Spider的一些属性和方法。还有CrawlSpider、XMLFeedSpider、CSVFeedSpider 等就不多解释了。其实有Spider就足够解决大部分爬虫了。

    选择器

    scrapy封装了css选择器、xpath和正则。当然你要使用外部bs4和lxml只需导入对应包就行。 这个没什么需要说的,会用xpath和pyquery基本就会这个了

    items

    (https://doc.scrapy.org/en/latest/topics/items.html) 作用是从非结构化源中提取结构化数据。通俗的来说就是从网页提取你想要的信息,然后把这些信息打包成一个类似于字典的类。注意:提取是爬虫做的事,这个文件里面的类仅仅起着一个字典的作用。至于为什么需要这样一个类就不清楚了。写法很简单,看例子。

    import scrapy class MyItem(scrapy.Item): name = scrapy.Field() price = scrapy.Field() stock = scrapy.Field()

    管道

    简单来说,就是将item的数据存储到数据库或文件中。另外,他还有一些其他的功能,比如清理HTML数据,去重数据等。 每个管道类都可以有四个方法,其中process_item必须有

    process_item:用于写一些存储的代码open_spider:打开蜘蛛时会调用此方法,用于打开资源close_spider:蜘蛛关闭时调用此方法,用于关闭资源from_crawler:同Spider的方法,一般用于获取setting.py的配置,这是为了便于修改参数,当然你完全可以不写这个方法,将一些参数直接定义为类属性。

    存储到MongoDB的示例代码(这是官网照搬的):

    import pymongo class MongoPipeline(object): collection_name = 'scrapy_items' def __init__(self, mongo_uri, mongo_db): self.mongo_uri = mongo_uri self.mongo_db = mongo_db @classmethod def from_crawler(cls, crawler): return cls( mongo_uri=crawler.settings.get('MONGO_URI'), mongo_db=crawler.settings.get('MONGO_DATABASE', 'items') ) def open_spider(self, spider): self.client = pymongo.MongoClient(self.mongo_uri) self.db = self.client[self.mongo_db] def close_spider(self, spider): self.client.close() def process_item(self, item, spider): self.db[self.collection_name].insert_one(dict(item)) return item

    Feed exports

    当我们没有写数据库管道的时候,我们又想持久化数据。这样我们就可以通过 Feed exports的方式导出数据。支持json、json行、csv、xml、pickle、marshal。

    使用也很简单,在抓取的时候加上-o参数。scrapy crawl quotes -o a.json

    请求和响应

    scrapy.Request(url [,callback,method =‘GET’,headers,body,cookies,meta,encoding =‘utf-8’,priority = 0,dont_filter = False,errback,flags ] ) 参数:

    url:请求的URLcallback:解析响应的函数method:请求的类型:‘GET’、'POST’、'PUT’等meta:用于传递参数给解析函数body:请求体headers:请求头,一般用不到cookie:不解释encoding:编码priority:请求的优先级dont_filter:是否过滤相同的URLerrback:出现异常时调用的处理方法

    属性和方法:

    url:请求的urlmethod:请求的类型headers:请求头body:参数传入的bodymeta:参数传入的metacopy():返回一个新请求,该请求是此请求的副本replace():不知道干什么的

    response(url [,status = 200,headers = None,body = b’’,flags = None,request = None ] ) 一般是下载器返回给解析函数的响应体,所以参数不重要,直接看属性。

    url:…status:响应码headers:响应头body:响应体request:此属性,仅仅在蜘蛛中间件可用。一般用于将失败和异常的请求重发。meta:requets.meta传递过来的值flags:暂时没用过copy():返回一个副本replace():不知道有什么用urljoin():作用同urlparse.urljoin(response.url, url)follow (): 参数同scrapy.Request。用于在解析函数中发出新的请求,可以替代scrapy.Request。而且,支持相对链接和a类型的选择器。

    设置

    scrapy允许在多个层面上修改设置。他们分别是(包含优先级):

    命令行选项(最优先)每蜘蛛的设置项目设置模块每个命令的默认设置默认全局设置(优先级较低)

    我们一般会修改2和3。2是通过爬虫的custom_settings属性来配置,3则是通过settings.py来配置。

    常用配置:

    CONCURRENT_ITEMS:默认100,项目管道并行处理的最大并发数量,一般不做修改。只有当你的爬虫获取数据的速度超过这个的时候再适当增加以提高速度。CONCURRENT_REQUESTS:默认16,Scrapy下载程序将执行的最大并发(即同时)请求数。一般看代理去改动。CONCURRENT_REQUESTS_PER_DOMAIN :默认8,对某个域名的最大并发数。不清楚上面那个优先级高,还是这个优先级高。CONCURRENT_REQUESTS_PER_IP:默认0,对单个IP的最大并发数。一般只会修改上一个参数,而不会去改动这个。DEFAULT_REQUEST_HEADERS :用于Scrapy HTTP请求的默认标头。这个依需求而定。DEPTH_LIMIT:默认0,允许爬取的最大深度DEPTH_PRIORITY ,默认0,大于0表示广度优先爬取,小于0表示更快的深度优先爬取。scrapy使用的是LIFO队列,这基本上表示它以深度优先顺序进行爬取。DEPTH_STATS_VERBOSE :默认False,是否收集详细的深度统计数据。如果启用此选项,则会在统计信息中收集每个深度的请求数。DNSCACHE_ENABLED:默认True,是否启用DNS内存缓存。DNSCACHE_SIZE:默认10000,DNS内存缓存大小。(这个单位不会是字节吧)DNS_TIMEOUT :默认60,在几秒钟内处理DNS查询的超时。支持浮动。DOWNLOADER_MIDDLEWARES:默认{},包含项目中启用的下载器中间件和优先级的字典DOWNLOADER_STATS :默认True, 是否启用下载程序统计信息收集(没用过,看起来有用)DOWNLOAD_DELAY:默认0,在从同一网站下载连续页面之前,下载程序应等待的时间(以秒为单位)。这个参数一般会修改,太快也不好。DOWNLOAD_TIMEOUT :默认180,下载程序在超时之前等待的时间DOWNLOAD_MAXSIZE :默认1073741824(1024MB)。下载程序将下载的最大响应大小(以字节为单位)。(这,难道爬虫还会爬超过1G的文件吗,所以这个参数不理他就行)DOWNLOAD_WARNSIZE:默认值:33554432(32MB)。下载程序将开始警告的响应大小。DOWNLOAD_FAIL_ON_DATALOSS:默认True,响应头的Content-Length参数的值与返回的内容长度不符时是否处理。Fasle则表示这个错误没什么关系,数据我一样要。LOG_ENABLED:默认True,是否启用日志记录LOG_ENCODING :默认‘utf-8’,用于记录的编码LOG_LEVEL:默认’DEBUG’,记录的最低级别。可用级别有:CRITICAL,ERROR,WARNING,INFO,DEBUG。SPIDER_MIDDLEWARES:默认{}, 蜘蛛中间件URLLENGTH_LIMIT:默认2083,允许抓取的网址的最大网址长度。USER_AGENT :默认: “Scrapy/VERSION (+https://scrapy.org)”。爬网时使用的默认User-Agent。没什么用,一般被覆盖。ROBOTSTXT_OBEY :默认True,是否遵循robot协议。遵循的话那爬虫就没有存在的意义了。所以一般改为False。

    还有其他的很多参数在刚使用的时候是不会遇到的,所以就不一一列举了。

    总结

    使用scrapy的一般步骤

    创建项目:scrapy startproject baidu测试xpath规则:scrapy shell “https://www.baidu.com”创建爬虫文件并编写部分代码编写items.py需要抓取的字段补全爬虫文件代码编写pipelines.py的mongo管道修改配置文件的一些参数编写随机头和代理中间件

    可以根据这个步骤一步一步的看,然后查怎么去实现。

    原文博客:https://blog.csdn.net/Qwertyuiop2016/ 现在这个是小号,给爬虫用的

    欢迎关注我的微信公众号,分享我的学习经验和一些觉得不错的资源。如果有问题的话,也可以在微信公众号联系我。


    最新回复(0)