# 1 scrapy startproject cnblogs_crawl # 2 scrapy genspider cnblogs www.cnblogs.com
# 1 放 :yield Request(url,callback=self.parser_detail,meta={'item':item}) # 2 取:response.meta.get('item')
- 在配置文件中進行相關的配置便可:(默認還有一套setting) #1 增長併發: 默認scrapy開啓的併發線程爲32個,能夠適當進行增長。在settings配置文件中修改CONCURRENT_REQUESTS = 100值爲100,併發設置成了爲100。 #2 提升日誌級別: 在運行scrapy時,會有大量日誌信息的輸出,爲了減小CPU的使用率。能夠設置log輸出信息爲INFO或者ERROR便可。在配置文件中編寫:LOG_LEVEL = ‘INFO’ # 3 禁止cookie: 若是不是真的須要cookie,則在scrapy爬取數據時能夠禁止cookie從而減小CPU的使用率,提高爬取效率。在配置文件中編寫:COOKIES_ENABLED = False # 4禁止重試: 對失敗的HTTP進行從新請求(重試)會減慢爬取速度,所以能夠禁止重試。在配置文件中編寫:RETRY_ENABLED = False # 5 減小下載超時: 若是對一個很是慢的連接進行爬取,減小下載超時能夠能讓卡住的連接快速被放棄,從而提高效率。在配置文件中進行編寫:DOWNLOAD_TIMEOUT = 10 超時時間爲10s
# 2大中間件:下載中間件,爬蟲中間件 # 1 寫在middlewares.py中(名字隨便命名) # 2 配置生效() SPIDER_MIDDLEWARES = { 'cnblogs_crawl.middlewares.CnblogsCrawlSpiderMiddleware': 543, } DOWNLOADER_MIDDLEWARES = { 'cnblogs_crawl.middlewares.CnblogsCrawlDownloaderMiddleware': 543, } # 2 下載中間件 -process_request:(請求去,走) # - return None: 繼續處理當次請求,進入下一個中間件 # - return Response: 當次請求結束,把Response丟給引擎處理(能夠本身爬,包裝成Response) # - return Request : 至關於把Request從新給了引擎,引擎再去作調度 # - 拋異常:執行process_exception -process_response:(請求回來,走) # - return a Response object :繼續處理當次Response,繼續走後續的中間件 # - return a Request object:從新給引擎作調度 # - or raise IgnoreRequest :process_exception -process_exception:(出異常,走) # - return None: continue processing this exception # - return a Response object: stops process_exception() chain :中止異常處理鏈,給引擎(給爬蟲) # - return a Request object: stops process_exception() chain :中止異常處理鏈,給引擎(從新調度)
# 在爬蟲已啓動,就打開一個chrom瀏覽器,之後都用這一個瀏覽器來爬數據 # 1 在爬蟲中建立bro對象 bro = webdriver.Chrome(executable_path='/Users/liuqingzheng/Desktop/crawl/cnblogs_crawl/cnblogs_crawl/chromedriver') # 2 中間件中使用: spider.bro.get(request.url) text=spider.bro.page_source response=HtmlResponse(url=request.url,status=200,body=text.encode('utf-8')) return response # 3 關閉,在爬蟲中 def close(self, reason): self.bro.close()
# 請求頭中的user-agent list=['',''] # pip3 install fake-useragent # https://github.com/hellysmile/fake-useragent from fake_useragent import UserAgent ua=UserAgent(verify_ssl=False) print(ua.random)
# 去重源碼分析 # from scrapy.core.scheduler import Scheduler # Scheduler下:def enqueue_request(self, request)方法判斷是否去重 if not request.dont_filter and self.df.request_seen(request): Requests對象,RFPDupeFilter對象 # 若是要本身寫一個去重類 -寫一個類,繼承BaseDupeFilter類 -重寫def request_seen(self, request): -在setting中配置:DUPEFILTER_CLASS = '項目名.dup.UrlFilter' # scrapy起始爬取的地址 def start_requests(self): for url in self.start_urls: yield Request(url) -增量爬取(100連接,150個連接) -已經爬過的,放到某個位置(mysql,redis中:集合) -若是用默認的,爬過的地址,放在內存中,只要項目一重啓,就沒了,它也不知道我爬過那個了,因此要本身重寫去重方案 -你寫的去重方案,佔得內存空間更小 -bitmap方案 -BloomFilter布隆過濾器 from scrapy.http import Request from scrapy.utils.request import request_fingerprint # 這種網址是一個 requests1=Request(url='https://www.baidu.com?name=lqz&age=19') requests2=Request(url='https://www.baidu.com?age=18&name=lqz') ret1=request_fingerprint(requests1) ret2=request_fingerprint(requests2) print(ret1) print(ret2) # bitmap去重 一個小格表示一個鏈接地址 32個鏈接,一個比特位來存一個地址 # https://www.baidu.com?age=18&name=lqz ---》44 # https://www.baidu.com?age=19&name=lqz ---》89 # c2c73dfccf73bf175b903c82b06a31bc7831b545假設它佔4個bytes,4*8=32個比特位 # 存一個地址,佔32個比特位 # 10個地址,佔320個比特位 #計算機計量單位 # 比特位:只能存0和1 # 8個比特位是一個bytes # 1024bytes=1kb # 1024kb=1m # 1024m=1g # 布隆過濾器:原理和python中如何使用 def request_seen(self, request): # 把request對象傳入request_fingerprint獲得一個值:aefasdfeasd # 把request對象,惟一輩子成一個字符串 fp = self.request_fingerprint(request) #判斷fp,是否在集合中,在集合中,表示已經爬過,return True,他就不會再爬了 if fp in self.fingerprints: return True # 若是不在集合中,放到集合中 self.fingerprints.add(fp) if self.file: self.file.write(fp + os.linesep)
# 1 安裝pip3 install scrapy-redis # 源碼部分,不到1000行, # 1 原來的爬蟲繼承 from scrapy_redis.spiders import RedisSpider class CnblogsSpider(RedisSpider): #start_urls = ['http://www.cnblogs.com/'] redis_key = 'myspider:start_urls' # 2 在setting中配置 SCHEDULER = "scrapy_redis.scheduler.Scheduler" DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter" ITEM_PIPELINES = { 'scrapy_redis.pipelines.RedisPipeline': 300 } # 3 多臺機器上啓動scrapy # 4 向reids中發送起始url lpush myspider:start_urls https://www.cnblogs.com
# 編譯型語言和解釋型語言 # python,js,php 解釋型: 必定要有個解釋器 (全都誇平臺,在不一樣平臺裝不通平臺的解釋器便可) # 編譯型語言:c,c++ java(有人說是編譯型,有人說是解釋型) -java:jdk,jre,jvm(三個分別是啥) -jdk:java開發環境(開發人員要裝) -jre:java運行環境(要運行java程序,必須裝) -jvm:java虛擬機,全部的java程序必須運行在虛擬機之上 -java對外發布:跨平臺,一處編碼,到處運行(1990年) -java編譯----》字節碼文件(.class文件)----》字節碼文件在jvm上運行---》在不一樣平臺裝不通java虛擬---》實現了跨平臺 -java:1.5---》古老 1.6 1.7 ---》java 8(用的還比較多)---》java9 ---》java13 -c語言:寫完了,想在windwos下運行----》跑到windows機器下編譯成可執行文件 -想在linux下運行----》跑到linux機器下編譯成可執行文件 -linux上裝python環境(源碼安裝,make,make install) -go編譯型:跨平臺編譯(在windows上能夠編譯出linux下可執行文件)---》2009年--》微服務 -全部代碼都編譯成一個可執行文件(web項目---》編譯以後---》可執行文件---》丟到服務器就能執行,不須要安裝任何依賴) -java要運行---》最低最低要跑在java虛擬機之上(光jvm要跑起來,就佔好幾百m內存)---》 -安卓手機app--java開發的---》你的安卓手機在上面跑了個jvm -go:就是個可執行文件(go的性能比java高,他倆不相上下),阿里:本身寫了jvm -安卓:谷歌,---->當時那個年代,java程序員多---》java能夠快速轉過去---》 -谷歌:Kotlin:---》用來取代java---》寫安卓---》在國際上排名比go高 -同年ios/mac軟件:object-c-----》swift(蘋果的一個工程師,沒事的時候,寫的一個語言)---》過了沒幾年,跳槽去了facebook----》 -java:sun公司出的,後來被甲骨文收購了,開始噁心人---》把java作成收費---》一門收費 -c#:微軟的:一開始收費,比java要好,沒人用,免費,開源了,也沒人用 -java se java ee java me -python寫的代碼,用打包工具,打包成exe----》把代碼和解釋器通通打包到exe中了 -垃圾回收機制:挺高端
1 全站爬取cnblogs,作成分佈式爬蟲php
# 1 代碼發佈系統 +cmdb+監控+日誌---》devops平臺、自動化運維平臺 # 2 go挺高級(併發)前端,mysql,redis,mongodb,es 缺了個go的web框架,orm -beego:中國人寫的(跟django很像。orm,中間件。。。。。)https://beego.me/docs/intro/ -gin:老外寫的(flask,沒有orm ),gorm https://github.com/gin-gonic/gin -Iris: