python爬蟲---js加密和混淆,scrapy框架的使用.
一丶js加密和js混淆
js加密
對js源碼進行加密,從而保護js代碼不被黑客竊取.(一般加密和解密的方法都在前端)
http://www.bm8.com.cn/jsConfusion/ # 反解密
js混淆
# 目的: 為了縮小js體積,加快http傳輸速度 ,混淆的目的是保護代碼
· 合並多個js文件
· 去除js代碼里面的空格和換行
· 壓縮js里面的變量名
· 剔除掉注釋
二丶SCRAPY爬蟲框架
概述scrapy框架特點
- 高性能的網絡請求
- 高性能的數據解析
- 高性能的持久化存儲
- 深度爬取
- 全棧爬取
- 分布式
- 中間件
- 請求傳參
下載與安裝
- 環境的安裝:
- mac/linux:pip install scrapy
- window:
- pip install wheel
- 下載twisted http://www.lfd.uci.edu/~gohlke/pythonlibs/#twisted
- 進入下載目錄,執行 pip install Twisted‑17.1.0‑cp35‑cp35m‑win_amd64.whl
- pip install pywin32
- pip install scrapy
基本使用
創建項目
- 新建一個工程:scrapy startproject ProName
- 目錄結構:
- spiders(包):空包
- settings:配置文件
- 不遵從robots
- UA偽裝
- 日志等級的指定
- cd ProName:進入到工程目錄中
- 在spiders(爬蟲文件夾)中創建一個爬蟲文件
- scrapy genspider spiderName www.xxx.com
- 編寫代碼:主要的代碼會編寫在爬蟲文件中
- 執行工程:scrapy crawl spiderName
scrapy目錄結構
- 項目名
- 同名項目文件夾
- spiders 文件夾
- init.py
- items.py
- middlewares.py
- pipelines.py
- settings.py
- scrapy.cfg
scrapy數據解析
# scrapy 可以使用 xpath進行解析
# extract_first() 獲取 讀取文本並獲得索引為0的字符串
# extract() 獲取文本
content = div.xpath('.//div[@class="link-detail"]/a/text()').extract_first()
scrapy數據存儲
# 基於終端進行持久化存儲
- 只可以將parse方法的返回值存儲到本地的磁盤文件(指定形式后綴)中
- scrapy crawl spiderName -o filePath
# 基於管道持久化存儲 (**)
- 在items注冊存儲的字段 (Filed萬能字段,包含大部分數據類型)
- 在piplelines文件 編寫管道類 ,並在settings配置文件進行注冊'ITEM_PIPELINES'
- 編碼流程
- 1.在爬蟲文件中進行數據解析
- 2.在item類中定義相關的屬性
- 3.將解析到的數據存儲到一個item類型的對象中
- 4.將item類型的對象提交給管道 (yiled item)
- 5.管道類的process_item方法負責接受item,接受到后可以對item實現任意形式的持久化存儲操作
- 6.在配置文件中開啟管道
- 一個管道類對應一種平台的持久化存儲
## 兩種方式
# 基於 本地的管道存儲
class ChoutiproPipeline(object):
# 重寫父類的方法, 只執行一次
fp = None
def open_spider(self, spider):
print('開始爬蟲~~~~')
self.fp = open('./本地持久化存儲文件.txt', 'w', encoding='utf-8')
def process_item(self, item, spider):
author = item['author']
content = item['content']
self.fp.write(author + ':' + content + '\n')
return item
def close_spider(self, spider):
print('爬蟲結束~~~')
self.fp.close()
# 基於 mysql的管道存儲
class MySqlChoutiproPipeline(object):
conn = None
cursor = None
def open_spider(self, spider):
print('創建數據庫連接~~')
# 建立數據庫連接
self.conn = pymysql.Connection(host='127.0.0.1', port=3306, db='scrapy_db1', user='root', password='123',charset='utf8')
# pymysql.Connection(host='127.0.0.1', port=3306, user='root', password='123', db='spider', charset='utf8')
def process_item(self, item, spider):
authro = item['author']
content = item['content']
sql = 'insert into chouti values ("%s","%s")' %(authro ,content)
self.cursor = self.conn.cursor()
try:
self.cursor.execute(sql)
self.conn.commit() # 提交
except Exception as e:
print(e)
self.conn.rollback() # 回滾
return item
def close_spider(self,spider):
self.cursor.close()
self.conn.close()