小白_開始學Scrapy__原理

總體架構

  1. 引擎(Scrapy Engine),用來處理整個系統的數據流處理,觸發事務。
  2. 調度器(Scheduler),用來接受引擎發過來的請求,壓入隊列中,並在引擎再次請求的時候返回。
  3. 下載器(Downloader),用於下載網頁內容,並將網頁內容返回給蜘蛛。
  4. 蜘蛛(Spiders),蜘蛛是主要幹活的,用它來制訂特定域名或網頁的解析規則。編寫用於分析response並提取item(即獲取到的item)或額外跟進的URL的類。 每一個spider負責處理一個特定(或一些)網站。
  5. 項目管道(Item Pipeline),負責處理有蜘蛛從網頁中抽取的項目,他的主要任務是清晰、驗證和存儲數據。當頁面被蜘蛛解析後,將被髮送到項目管道,並通過幾個特定的次序處理數據。
  6. 下載器中間件(Downloader Middlewares),位於Scrapy引擎和下載器之間的鉤子框架,主要是處理Scrapy引擎與下載器之間的請求及響應。
  7. 蜘蛛中間件(Spider Middlewares),介於Scrapy引擎和蜘蛛之間的鉤子框架,主要工做是處理蜘蛛的響應輸入和請求輸出。
  8. 調度中間件(Scheduler Middlewares),介於Scrapy引擎和調度之間的中間件,從Scrapy引擎發送到調度的請求和響應。

 

數據流過程:

  1. 引擎打開一個網站(open a domain),找處處理該網站的Spider並向該spider請求第一個要爬取的URL(s)。
  2. 引擎從Spider中獲取到第一個要爬取的URL並在調度器(Scheduler)以Request調度。
  3. 引擎向調度器請求下一個要爬取的URL。
  4. 調度器返回下一個要爬取的URL給引擎,引擎將URL經過下載中間件(請求(request)方向)轉發給下載器(Downloader)。
  5. 一旦頁面下載完畢,下載器生成一個該頁面的Response,並將其經過下載中間件(返回(response)方向)發送給引擎。
  6. 引擎從下載器中接收到Response並經過Spider中間件(輸入方向)發送給Spider處理。
  7. Spider處理Response並返回爬取到的Item及(跟進的)新的Request給引擎。
  8. 引擎將(Spider返回的)爬取到的Item給Item Pipeline,將(Spider返回的)Request給調度器。
  9. (從第二步)重複直到調度器中沒有更多地request,引擎關閉該網站。

 

簡單examplehtml

1 import scrapy 2 
 3 from 例子.items import 例子Item 4 
 5 class 例子Spider(scrapy.Spider): 6     name = "例子"
 7     allowed_domains = ["例子.org"] 8     start_urls = [ 9         "例子1",        "例子2"
10 ]  #此爲列表 11 
12     def parse(self, response): 13         for sel in response.xpath('xpath代碼'): 14             item = 例子Item() 15             item['title'] = sel.xpath('a/text()').extract() 16             item['link'] = sel.xpath('a/@href').extract() 17             item['desc'] = sel.xpath('text()').extract() 18             yield item

製做Scrapy爬蟲項目步驟python

  1 新建項目shell

    startproject 項目名json

  2 明確目標(items.py)架構

  3 製件爬蟲程序併發

    進入到spiders文件夾中,執行:app

    scrapy genspider 爬蟲文件名 "域名"框架

    #  ex::::   scrapy genspider baiduspaider "www.baidu.comdom

  4 處理數據(pipelines.py)scrapy

  5 配置settings.py

  6 運行爬蟲程序

    scrapy crawl 爬蟲名

scrapy 項目文件詳解

  

文件配置詳解

  settings.py

   USER_AGENT = 'baidu (+http://www.yourdomain.com)'

  # 是否遵循robot協議,改成False
   ROBOTSTXT_OBEY = False
  # 最大併發量 ,默認爲16
  CONCURRENT_REQUESTS = 32
  # 下載延遲時間
  DOWNLOAD_DELAY = 3
  # 請求報頭
  DEFAULT_REQUEST_HEADERS = {
   'User-Agent':"Mozilla/5.0",
   'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
   'Accept-Language': 'en',
      }
  # 下載中間件
  DOWNLOADER_MIDDLEWARES = {
   'baidu.middlewares.BaiduDownloaderMiddleware': 543,
    }
  # 項目管道
  ITEM_PIPELINES = {
   'baidu.pipelines.BaiduPipeline': 300, # 此處有優先級
      }
def parse(self, response):
  #response.xpath('h1') 結果爲選擇器對象
  #[<selector ... data = <h1 class="" >>]
  # response.xpath('//h1/text()')結果選擇器對象
  # [<selector ...data="text()">]
  # response.xpath('//h1/text()').extract()
  # ['text()']
 知識點
  1 extract():獲取選擇器對象中的文本內容
    response.xpath('')獲得的結果爲選擇器對象的列表
  2 pipellines.py中必須有1個函數叫
    def process_item(self,item,spider):
      return item [若是有多個piplines的話,須要使用return返回]
  3 爬蟲程序中,start_urls必須爲列表
    
  4 scrapy設置 log :settings.py
    LOG_LEVEL = "DEBUG"

    5層日誌級別
      CRITICAL:嚴重錯誤
      ERROR :通常錯誤
      WARNING:警告信息
      DEBUG:調試信息
      INFO:通常信息
    LOG_FILE ='xx.log' #設置指定log文件

# parse函數是第一次從start_url中初始URL發請求,
# 獲得響應後必需要調用的函數

def parse(self,response):


2 如何保存爲csv ,或是 json文件
  1 scrapy crawl tengxun -o tenxun.csv
  2 scrapy crawl tengxun -o tenxun.json
  解決導出亂碼問題(在settings裏面加入一個變量)
    FEED_EXPORT_ENCODING = 'utf-8'
3 下載器中間件
  1 隨機User-Agent
    1 settings.py
      1 更改settings.py 中更改 USER_AGENT
      2 更改settings.py 中更改 DEFALUT_REQUEST_HEADERS ={"":"",}
    2 設置中間件[ USER_AGENT]  的更改
      1 新建一個useragent.py,存放大量USER_AGENT
      2 middleawres.py中寫class
      3 settings.py中開啓 DOWNLOADER_MIDDLEWARES     
      
      主要重寫
      class xxx..DownloaderMiddleware(object):
        def process_request(self,request,spider):
            request.headers["User-Agent"]=random.choice(USER_AGENT_LIST)
  2 設置代理
    也是重寫
    def process_request(self,request,spider):
      proxyList=[  
          "http://1.1.1.1:80",
          "http://1.1.1.2:80",
          "http://user:password@1.1.1.1:80",
          .....
        ]  
      # request的meta  參數
      request.meta['proxy'] = random.choice(proxyList)

  3 圖片管道ImagePipeline
    1 使用流程(要操做的文件)
      1 settings.py
        設置圖片要保存的路徑的變量
        IMAGES_STORE ="/home/admin/aaa/images"
    2 pipelines.py
      1 導入scrapy定義好的圖片管道類
        from scrapy.pipelines.images import ImagesPipeline
      2 定義本身的class,繼承scrapy的圖片管道類
        class xxxImagePipeline(ImagesPipeline):
          def get_media_requests(self,item,info):
5 dont_filter參數
  scrapy.Request(url,callback=parse,dont_filter=.) 
  1 False:默認,檢查域
  2 True:忽略域組檢查
6 scrapy shell
  1 scrapy shell "http://www.baidu.com"
  2 response.txt
7 CrawlSpider類
  from scrapy.linkerextractors import LinkExitractor
  1 Spider的派生類
    Spider類:只爬取start_urls列表中的網頁
    CrawlSpider類,定義了一些規則(ruler)來提供提取連接,跟進連接,
  2 建立CrawlSpider模板爬蟲文件
    加-t crawl
    
    ex > scrapy genspider -t crrawl tengxun 'xxx.com'
  3 示例,從頁面中提取全部的連接
    1 scrapy shell 'xxx.com'
    2 from scrapy.linkerextractors import LinkExtractor # 導入連接規則匹配類,用來提取符合規則的連接
      from scrapy.spiders import CrawlSpider,Rule    # 導入spiders的派生類CrawlSpider,Rule指定特定操做
    3 linkList = LinkExtractor(aallow=("正則"))
    4 linkList =extract_links(response)
  4 Rule
    1 做用:對爬取網站動做指定特色操做
      rules = (
          Rule(LinkExtractor(allow=r'正則'),
          callback = 'parseHtml',
          follow=True),)
        )
   
    
  ocr_電子掃描   Ubuntu: sudo apt-get install tesseract-ocr    驗證: tesseract test1.jpg test1.txt python 調用 : 須要安裝 方法不多,就用1 個,圖片轉字符串 : image_to_string from PIL_to_string ex::: import pytesseract from PIL import Image image = Image.open('test1.jpg') s= pytesseract.image_to_string(image) print(s)
 

 

# 重寫spider類的start_request()方法,去掉start_urls def start_requests(self)
相關文章
相關標籤/搜索