爬蟲~scrapy1

1 全站爬取cnblogs

# 1 scrapy startproject cnblogs_crawl
# 2 scrapy genspider cnblogs www.cnblogs.com

2 scarpy請求傳參

# 1 放 :yield Request(url,callback=self.parser_detail,meta={'item':item})
# 2 取:response.meta.get('item')

3 提升爬取效率

- 在配置文件中進行相關的配置便可:(默認還有一套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

4 下載中間件

# 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 :中止異常處理鏈,給引擎(從新調度)

5 集成selenium

# 在爬蟲已啓動,就打開一個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()

6 fake-useragent

# 請求頭中的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)

7 去重源碼分析

# 去重源碼分析
# 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)

8 分佈式爬蟲

# 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:
相關文章
相關標籤/搜索