setting.py文件中设置LOG_LEVEL = 'INFO'
LOG_ENABLED 默认: True,启用logging
LOG_ENCODING 默认: ‘utf-8’,logging使用的编码
LOG_FILE 默认: None,在当前目录里建立logging输出文件的文件名,例如:LOG_FILE = ‘log.txt’
配置了这个文件,就不会在控制台输出日志了
LOG_LEVEL 默认: ‘DEBUG’,log的最低级别,会打印大量的日志信息,若是咱们不想看到太多的日志,能够提升log等级
共五级:
CRITICAL - 严重错误
ERROR - 通常错误
WARNING - 警告信息
INFO - 通常信息
DEBUG - 调试信息
LOG_STDOUT 默认: False 若是为 True,进程全部的标准输出(及错误)将会被重定向到log中。
例如,执行 print(“hello”) ,其将会显示到日志文件中
html
并发是指同时处理的request的数量。其有全局限制和局部(每一个网站)的限制。
Scrapy默认的全局并发限制对同时爬取大量网站的状况并不适用,所以您须要增长这个值。 增长多少取决于您的爬虫能占用多少CPU。 通常开始能够设置为 100 。不过最好的方式是作一些测试,得到Scrapy进程占取CPU与并发数的关系。 为了优化性能,您应该选择一个能使CPU占用率在80%-90%的并发数python
在setting.py文件中写上CONCURRENT_REQUESTS = 100,scrapy中默认的并发数是32
对失败的HTTP请求进行重试会减慢爬取的效率,尤为是当站点响应很慢(甚至失败)时, 访问这样的站点会形成超时并重试屡次。这是没必要要的,同时也占用了爬虫爬取其余站点的能力。web
RETRY_ENABLED = False
若是您对一个很是慢的链接进行爬取(通常对通用爬虫来讲并不重要), 减少下载超时能让卡住的链接能被快速的放弃并解放处理其余站点的能力。chrome
DOWNLOAD_TIMEOUT = 15,其中15是设置的下载超时时间
除非您 真的 须要,不然请禁止cookies。在进行通用爬取时cookies并不须要, (搜索引擎则忽略cookies)。禁止cookies能减小CPU使用率及Scrapy爬虫在内存中记录的踪影,提升性能。数据库
`COOKIES_ENABLED = False`
除非您对跟进重定向感兴趣,不然请考虑关闭重定向。 当进行通用爬取时,通常的作法是保存重定向的地址,并在以后的爬取进行解析。 这保证了每批爬取的request数目在必定的数量, 不然重定向循环可能会致使爬虫在某个站点耗费过多资源。浏览器
REDIRECT_ENABLED = False
单位秒,支持小数,通常都是随机范围:0.5DOWNLOAD_DELAY 到 1.5DOWNLOAD_DELAY 之间缓存
DOWMLOAD_DELY=3,设置延迟下载能够避免被发现
初学者最头疼的事情就是没有处理好异常,当爬虫爬到一半的时候忽然由于错误而中断了,可是这时又不能从中断的地方开始继续爬,顿时感受内心日了狗,可是这里有一个方法能够暂时的存储你爬的状态,当爬虫中断的时候继续打开后依然能够从中断的地方爬,不过虽然说持久化能够有效的处理,可是要注意的是当使用cookie临时的模拟登陆状态的时候要注意cookie的有效期cookie
只须要在setting.py中JOB_DIR=file_name其中填的是你的文件目录,注意这里的目录不容许共享,只能存储单独的一个spdire的运行状态,若是你不想在从中断的地方开始运行,只须要将这个文件夹删除便可网络
固然还有其余的放法:scrapy crawl somespider -s JOBDIR=crawls/somespider-1,这个是在终端启动爬虫的时候调用的,能够经过ctr+c中断,恢复仍是输入上面的命令并发
ROBOTSTXT_OBEY = Ture,是否遵照 robots.txt,通常修改成False
在settings中取消注释便可
DEFAULT_REQUEST_HEADERS : 设置默认的请求headers
DEFAULT_REQUEST_HEADERS={{ 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 'Accept-Language': 'en', 'User-Agent':'......' #在这里配置你的请求头 }}
SPIDER_MIDDLEWARES:爬虫中间层 DOWNLOADER_MIDDLEWARES:下载中间层 # pipeline里面能够配置多个,每个spider都会调用全部配置的pipeline,后面配置的数字表示调用的优先级,数字越小,调用越早 ITEM_PIPELINES = {'项目名.pipelines.PipeLine类名': 300,} # 开发模式时,启用缓存,能够提升调试效率。一样的请求,若是缓存当中有保存内容的话,不会去进行网络请求,直接从缓存中返回。**部署时必定要注释掉!!!** HTTPCACHE_ENABLED = True HTTPCACHE_EXPIRATION_SECS = 0 HTTPCACHE_DIR = 'httpcache' HTTPCACHE_IGNORE_HTTP_CODES = [] HTTPCACHE_STORAGE = 'scrapy.extensions.httpcache.FilesystemCacheStorage' # 并发(下面都是默认值) CONCURRENT_ITEMS = 100 # 并发处理 items 的最大数量 CONCURRENT_REQUESTS_PER_DOMAIN = 8 # 并发下载任何单域的最大数量 CONCURRENT_REQUESTS_PER_IP = 0 # 并发每一个IP请求的最大数量 CONCURRENT_REQUESTS_PER_IP 不为0时,这个延时是针对每一个IP,而不是每一个域
必须在settings中,添加
ITEM_PIPELINES = { 'first_scrapy.pipelines.FirstScrapyPipeline': 300, # 优先级,数字越小, 优先级越高,越早调用范围 0-1000 }
对象以下:
class FirstScrapyPipeline(object): def process_item(self, item, spider): return item
process_item
process_item(self, item, spider): 处理item的方法, 必须有的!!! 参数: item (Item object or a dict) : 获取到的item spider (Spider object) : 获取到item的spider 返回 一个dict或者item
open_spider
open_spider(self, spider) : 当spider启动时,调用这个方法 参数: spider (Spider object) – 启动的spider
close_spider
close_spider(self, spider): 当spider关闭时,调用这个方法 参数: spider (Spider object) – 关闭的spider
from_crawler
@classmethod from_crawler(cls, crawler) 参数: crawler (Crawler object) – 使用这个pipe的爬虫crawler`
# pipelines.py from pymongo import MongoClient class FirstScrapyPipeline(object): @classmethod def from_crawler(cls, crawler): crawler() def open_spider(self, spider): self.client = MongoClient("***.***.***.**", 27017) # 数据库名admin self.db = self.client.test self.db.authenticate('user', password') self.my_set = self.db.my_set def process_item(self, item, spider): try: self.my_set.save(item["info"]) except Exception as e: print(e) return item def close_spider(self, spider): self.client.close()
# -*- coding: utf-8 -*- # @Time : 2019/4/22 18:07 # @Author : 甄超锋 # @Email : 4535@sohu.com # @File : run.py # @Software: PyCharm from scrapy import cmdline cmdline.execute("scrapy crawl lvdunspider".split())
# -*- coding: utf-8 -*- # @Time : 2019/4/22 18:07 # @Author : 甄超锋 # @Email : 4535@sohu.com # @File : run.py # @Software: PyCharm from LvdunSpider.spiders.lvdunspider import LvdunspiderSpider from scrapy.crawler import CrawlerProcess from scrapy.utils.project import get_project_settings # 获取settings.py模块的设置 settings = get_project_settings() process = CrawlerProcess(settings=settings) # 能够添加多个spider process.crawl(LvdunspiderSpider) # 启动爬虫,会阻塞,直到爬取完成 process.start()
使用python模块 fake-useragent 生成user-agent
安装:
pip install fake-useragent
简单使用:
from fake_useragent import UserAgent ua = UserAgent() #ie浏览器的user agent print(ua.ie) #opera浏览器 print(ua.opera) #chrome浏览器 print(ua.chrome) #firefox浏览器 print(ua.firefox) #safri浏览器 print(ua.safari) #最经常使用的方式 #写爬虫最实用的是能够随意变换user-agent, print(ua.random)
在middleware中使用
import random from scrapy import signals from fake_useragent import UserAgent class RandomUserAgentMiddleware(object): def __init__(self): self.agent = UserAgent() @classmethod def from_crawler(cls, crawler): return cls() def process_request(self, request, spider): request.headers.setdefault('User-Agent', self.agent.random)
在 ‘DOWNLOADER_MIDDLEWARES’ 项中启用中间件
DOWNLOADER_MIDDLEWARES = { 'LvdunSpider.middlewares.RandomUserAgentMiddleware': 543, }
pythonQQ交流群:785239887