python 基礎 網路爬蟲 day08
阿新 • • 發佈:2018-11-14
day07
1.response.xpath('xpath表示式')
xpath表示式沒有text()則結果為選擇器物件
xpath表示式加上text()則結果為選擇器文字物件
extract()將列表中所有元素序列化為Unicode字串
2.MongoDB持久化儲存
- settings.py設定相關變數
MONGODB_HOST = 'localhost'
MONGODB_PORT = 27017
MONGODB_DBNAME = 'daomudb'
MONGODB_DOCNAME = "daomubiji" - 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)
-
settings.py中新增專案管道
ITEM_PIPELINES = {'專案名.pipelines.類名':300}
4.MySQL
- settings.py設定相關變數
- pipelines.py中定義相關的類
- settings.py中新增專案管道
5.Scrapy模組方法
yield scrapy.Request(url,callback=解析方法名)
day08
1.如何設定隨機User-Agent
- settings.py(用於少量User-Agent切換,不推薦)
- 定義USER_AGENT變數值
- DEFAULT_REQUEST_HEADER={"User-Agent":" ",}
- 設定中介軟體的方法來實現
- 專案目錄中新建user_agents.py,放大量Agent
user_agents = [' ',' ',' ',' ',' ']
- 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)
- 設定settings.py
DOWNLOADER_MIDDLEWARES = { '專案名.middlewares.RandomUserAgentMiddleware':1}
- 專案目錄中新建user_agents.py,放大量Agent
- 直接在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)
- middlewares.py中新增代理中介軟體ProxyMiddleware
class ProxyMiddleware(object): def process_request(self,request,spider): request.meta['proxy'] = "http://180.167.162.166:8080"
- settings.py中新增
DOWNLOADER_MIDDLEWARES = { 'Tengxun.middlewares.RandomUserAgentMiddleware': 543, 'Tengxun.middlewares.ProxyMiddleware' : 250,
3.圖片管道:ImagePipeline
- 案例:鬥魚圖片抓取案例(手機app)
- 抓取目標
- 圖片連結
- 主播名
- 房間號
- 城市
把所有圖片儲存在/home/tarena/day08/Douyu/Douyu/Images
- 步驟
- 前提:手機和電腦為一個區域網
- Fiddler抓包工具
Connections:Allow remote computers to connect - Win+R:cmd -> ipconfig ->乙太網ip地址
- 配置手機
手機瀏覽器 -> http://ip地址:8888
下載:FiddlerRoot certificate - 安裝
設定 -> 更多 -> 從儲存裝置安裝 - 設定手機代理
長按wifi, -> 代理
ip地址:ip地址
埠號:埠號
4.ImagePipeline的使用方法
- pipelines.py中進行操作
- 匯入模組
from scrapy.pipelines.images import ImagesPipeline - 自定義類,繼承ImagesPipeline
class DouyuImagePipeline(ImagesPipeline): # 重寫get_media_requests方法 def get_media_requests(self,item,info): # 向圖片URL發起請求,並儲存到本地 yield scrapy.Request(url=item['link'])
- 匯入模組
- 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
- 建立專案:JD
- middlewares.py中新增selenium
- 導模組:from selenium import webdriver
- 定義中介軟體
class seleniumMiddleware(object): ... def process_request(self,request,info): #注意引數為request的url self.driver.get(request.url)
- settings.py
DOWNLOADER_MIDDLEWARES={"Jd.middleware.seleniumMiddleware":20}
7.Scrapy模擬登陸
- 建立專案:Renren
- 建立爬蟲檔案
8.機器視覺與 tesseract
- OCR(optical Character Recognition) 光學字元識別
掃描字元:通過字元形狀 --> 電子文字,OCR有很多的底層識別庫 - tesseract(谷歌維護的OCR識別庫,不能import,工具)
- 安裝
- windows下載安裝包
https://sourceforge.net/projects/tesseract-ocr-alt/files/tesseract-ocr-setup-3.02.02.exe/download
安裝完成後新增到環境變數 - Ubuntu:sudo apt-get install tesseract-ocr
- Mac:brew install tesseract
- windows下載安裝包
- 驗證
終端:tesserat test1.jpg text1.txt - 安裝pytesseract模組
python -m pip install pytesseract
#方法很少,就用1個,圖片轉字串:image_to_string - Python圖片的標準庫
from PIL import Image - 示例
- 驗證碼圖片以wb方式寫入到本地
- image = Image.open('驗證碼.jpg')
- 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)
-
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.分散式介紹
- 條件
- 多臺伺服器(資料中心,雲伺服器)
- 網路頻寬
- 分散式爬蟲方式
- 主從分散式
- 對等分散式
- scrapy-redis
今日示例
nvj1