1. 程式人生 > >python 基礎 網路爬蟲 day08

python 基礎 網路爬蟲 day08

day07

1.response.xpath('xpath表示式')
xpath表示式沒有text()則結果為選擇器物件
xpath表示式加上text()則結果為選擇器文字物件
extract()將列表中所有元素序列化為Unicode字串

2.MongoDB持久化儲存

  1. settings.py設定相關變數
    MONGODB_HOST = 'localhost'
    MONGODB_PORT = 27017
    MONGODB_DBNAME = 'daomudb'
    MONGODB_DOCNAME = "daomubiji"
  2. pipelines.py寫程式
    import pymongo
    class DaomuPipeline(object):
        def __init__(self):
            host = settings.MONGODB_HOST
            port = settings.MONGODB_PORT
            dbName = settings.MONGODB_DBNAME
            docName = settings.MONGODB_DOCNAME
            conn = pymongo.MongoClient(host=host,port=port)
            exec("db=conn."+dbName)
            exec("self.myset=db."+docName)

     

  3. settings.py中新增專案管道
    ITEM_PIPELINES = {'專案名.pipelines.類名':300}

4.MySQL

  1. settings.py設定相關變數
  2. pipelines.py中定義相關的類
  3. settings.py中新增專案管道

5.Scrapy模組方法
yield scrapy.Request(url,callback=解析方法名)


day08

1.如何設定隨機User-Agent

  1. settings.py(用於少量User-Agent切換,不推薦)
    1. 定義USER_AGENT變數值
    2. DEFAULT_REQUEST_HEADER={"User-Agent":" ",}
  2. 設定中介軟體的方法來實現
    1. 專案目錄中新建user_agents.py,放大量Agent
      user_agents = [' ',' ',' ',' ',' ']

       

    2. middlewares.py寫類RandomUserAgentMiddleware
      from 專案名.user_agents import user_agents
      import random
      class RandomUserAgentMiddleware(object):
          def process_request(self,request,spider):
              request.headers['User-Agent'] = random.choice(user_agents)
    3. 設定settings.py
      DOWNLOADER_MIDDLEWARES = {
          '專案名.middlewares.RandomUserAgentMiddleware':1}

       

  3. 直接在middlewares.py中新增類
    class RandomUserAgentMiddleware(object):
        def __init__(self):
            self.user_agents = [' ',' ',' ', ' ']
    
        def process_request(self,request,spider):
            request.header['User-Agent'] = random.choice(self.user_agents)

     

2.設定代理(DOWNLOADER MIDDLEWARES)

  1. middlewares.py中新增代理中介軟體ProxyMiddleware
    class ProxyMiddleware(object):
            def process_request(self,request,spider):
                request.meta['proxy'] = "http://180.167.162.166:8080"

     

  2. settings.py中新增
    DOWNLOADER_MIDDLEWARES = {
           'Tengxun.middlewares.RandomUserAgentMiddleware': 543,
           'Tengxun.middlewares.ProxyMiddleware' : 250,

     

3.圖片管道:ImagePipeline

  1. 案例:鬥魚圖片抓取案例(手機app)
    1. 選單 -->顏值
      http://capi.douyucdn.cn/api/v1/getVerticalRoom?limit=20&offset=0
  2. 抓取目標
    1. 圖片連結
    2. 主播名
    3. 房間號
    4. 城市
      把所有圖片儲存在/home/tarena/day08/Douyu/Douyu/Images
  3. 步驟
    1. 前提:手機和電腦為一個區域網
    2. Fiddler抓包工具
      Connections:Allow remote computers to connect
    3. Win+R:cmd -> ipconfig ->乙太網ip地址
    4. 配置手機
      手機瀏覽器 -> http://ip地址:8888
      下載:FiddlerRoot certificate
    5. 安裝
      設定 -> 更多 -> 從儲存裝置安裝
    6. 設定手機代理
      長按wifi, -> 代理
      ip地址:ip地址
      埠號:埠號

4.ImagePipeline的使用方法

  1. pipelines.py中進行操作
    1. 匯入模組
      from scrapy.pipelines.images import ImagesPipeline
    2. 自定義類,繼承ImagesPipeline
      class DouyuImagePipeline(ImagesPipeline):
                 # 重寫get_media_requests方法
          def get_media_requests(self,item,info):
                     # 向圖片URL發起請求,並儲存到本地
              yield scrapy.Request(url=item['link'])

       

  2. settings.py中定義圖片儲存路徑
    IMAGES_STORE = '/home/tarena/day08/Douyu/Douyu/Images'

5.dont_filter引數
 scrapy.Request(url,callback=...,dont_filter=False)
 dont_filter引數:False ->自動對URL進行去重
                            True -> 不會對URL進行去重

6.Scrapy對接selenium + phantomjs

  1. 建立專案:JD
  2. middlewares.py中新增selenium
    1. 導模組:from selenium import webdriver
    2. 定義中介軟體
       
      class seleniumMiddleware(object):
          ...
          def process_request(self,request,info):
              #注意引數為request的url
              self.driver.get(request.url)
              
              

       

  3. settings.py
    DOWNLOADER_MIDDLEWARES={"Jd.middleware.seleniumMiddleware":20}

7.Scrapy模擬登陸

  1. 建立專案:Renren
  2. 建立爬蟲檔案

8.機器視覺與 tesseract

  1. OCR(optical Character Recognition) 光學字元識別
    掃描字元:通過字元形狀 --> 電子文字,OCR有很多的底層識別庫
  2. tesseract(谷歌維護的OCR識別庫,不能import,工具)
    1. 安裝 
      1. windows下載安裝包
        https://sourceforge.net/projects/tesseract-ocr-alt/files/tesseract-ocr-setup-3.02.02.exe/download
        安裝完成後新增到環境變數
      2. Ubuntu:sudo  apt-get install tesseract-ocr
      3. Mac:brew install tesseract
    2. 驗證
      終端:tesserat test1.jpg text1.txt
    3. 安裝pytesseract模組
      python -m pip install pytesseract
      #方法很少,就用1個,圖片轉字串:image_to_string
    4. Python圖片的標準庫
      from PIL import Image
    5. 示例
      1. 驗證碼圖片以wb方式寫入到本地
      2. image = Image.open('驗證碼.jpg')
      3. s = pytesseract.image_to_string(image)
        import pytesseract
        from PIL import Image
        
        image = Image.open("test1.jpg")
        string = pytesseract.image_to_string(image)
        print(string)
        

         

    6. tesseract案例:登入豆瓣網站(驗證碼輸入)
       

      '''02_tesseract登陸豆瓣案例.py'''
      import requests
      from lxml import etree
      import pytesseract
      from PIL import Image
      from selenium import webdriver
      
      url = "https://www.douban.com/"
      headers = {"User-Agent":"Mozilla/5.0"}
      # 先訪問網站得到html
      res = requests.get(url,headers=headers)
      res.encoding = "utf-8"
      html = res.text
      # 用xpath把驗證碼圖片的連結給拿出來
      parseHtml = etree.HTML(html)
      s = parseHtml.xpath('//img[@class="captcha_image"]/@src')[0]
      # 訪問驗證碼圖片連結,得到html(位元組流)
      res = requests.get(s,headers=headers)
      res.encoding = "utf-8"
      html = res.content
      # 把圖片儲存到本地
      with open("zhanshen.jpg","wb") as f:
          f.write(html)
      # 把圖片->字串
      image = Image.open("test1.jpg")
      s = pytesseract.image_to_string(image)
      print(s)
      # 把這個字串輸入到驗證碼框中
      driver = webdriver.Chrome()
      driver.get(url)
      driver.find_element_by_name("captcha-solution").send_keys(s)
      driver.save_screenshot("驗證碼輸入.png")
      
      driver.quit()

       

 

9.分散式介紹

  1. 條件
    1. 多臺伺服器(資料中心,雲伺服器)
    2. 網路頻寬
  2. 分散式爬蟲方式
    1. 主從分散式
    2. 對等分散式
  3. scrapy-redis

今日示例

nvj1