csdn論壇(靜態網頁)
數據庫連接
安裝依賴庫 pymysql
相關操作代碼github(https://github.com/PyMySQL/PyMySQL)
connection = pymysql.connect(host='localhost',
user='root',
password='1234567a',
db='spider',
charset='utf8mb4',
cursorclass=pymysql.cursors.DictCursor)
項目使用的是peewee,ORM操作(還有djangORM sqlalchemy )github(https://github.com/coleifer/peewee)
優勢:1.隔離數據庫和版本 2.便於維護 3.SQL注入
db = MySQLDatabase("spider",host="127.0.0.1",port=3306,user="root",password="1234567a”)
class BaseModel(Model):
class Meta:
database = db
# 設置表需要注意的一些事項
"""
char類型 要設置最大長度 默認是255
對於無法確認的最大長度設置爲Text
設計表的時候,採集到的數據要儘量做格式化處理
default和null=True
"""
class Topic(BaseModel):
title = CharField()
content = TextField(default="")
id = IntegerField(primary_key=True)
author = CharField()
create_time = DateTimeField()
answer_nums = IntegerField(default=0)
click_nums = IntegerField(default=0)
praised_nums = IntegerField(default=0)
jtl = FloatField(default=0.0) # 結帖率
score = IntegerField(default=0) #賞分
status = CharField() # 轉態
last_answer_time = DateTimeField()
注意項:
F12查看‘元素’找到元素用Selector 的xpath解析出來(解析出來的繼續調用xpath 注意 需要加上當前路徑 ”.//div“)
自動加上域名 parse.urljson(domain,url)
當ORM有id屬性的時候就默認當做Primarykey(如果沒有回自動生成一個id),當對數據進行更新操作的時候不能直接調用save方法,調用topic.save(force_insert=True)#有id默認是更新 此時又沒有這條數據就會導致更新失敗
author_url.split("/")[-1] -1表示的是最後一個
字符串轉時間格式datetime.strptime(time_str,”%Y-%m-%d %H:%M:%S")
解析的時候有時候會碰到返回403之類的不正常錯誤 是反爬的問題,需要做相應處理
把字符串轉爲list ast.literal_eval(node_str)
京東項目(動態網頁)
-
瞭解哪些數據時動態加載
數據加載更慢
刪除js代碼,然後本地顯示html,看哪些數據沒有顯示就是動態加載的
-
如何獲取數據
-
分析
在控制檯的XHR(異步請求)看下有沒有請求
查詢js文件,js文件返回的是否有頁面的字段
分析(看js源文件)構造參數,js請求
-
selenium自動化
- pip install selenium
- 查看chrome瀏覽器版本(也可以是FireFox Android等等)下載對應的webDriver(http://npm.taobao.org/ 去下載)
-
from selenium import webdriver
brower = webdriver.Chrome(executable_path=‘/Application/PyCharm….’)
sl = Selector(text=brower.page_source)
登錄(request)
- 獲取session/cookies
- request.session()
- 登錄返回res.cookies.get_direct()
- cookies寫入本地
f = open(‘douban.cookie’,’wb’)
Pickle.dump(res.cookies,f)
f.close()
with open(‘douban.cookie’,’wb’) as f 就不需要調用close方法
登錄(selenuim)
ps:1. 裏面有iframe,selenium獲取不到 ,通過 brower.switch_to.frame(xpath)
2.brower.getCookie獲取,裏面信息比較多,需要過濾key value
滑動驗證碼
(1)鼠標移動位置上
(2)保存按住之前的圖
(3)按住顯示缺口圖 保存
(4)對比,計算出滑動距離
(5)滑動滑塊
(1)
from selenium.webdrive import Actionchains
ActionChains(brower).move_to_element(slider).perform()
(2)
xpath定位元素 img 的location 和size確定好位置
top,bottom,left,right = location[‘Y’],location[‘Y’]+size[‘height’],location[‘X’],location[‘X’]+size[‘width’]
brower.maximize_window()窗口最大化
brower.get_screen_as_png()獲取全屏圖片
install pillow
from PIL import Image
from IO import ByteIO()
screenshot = Image.open(BytesIO(screenshot))
crapcha = screenshot.crop(int(left),int(top),int(right),int(bottom))
(3) click_and_hold
(4)
對比像素 rgp不一樣(設置一個域值 60)
image.load()[i,j]
(5)
move_by_offset() 拖動
release 鬆開鼠標
用一個函數模擬人的拖動
驗證碼識別 服務商
- 雲打碼 ——> 比較準
- 超級鷹——>識別類型多
反爬&反反爬
- user-agent ————> install fake-useragent 隨機
- ip訪問頻率限制 ————>ip代理 免費(不穩定) 阿布雲
- 必須登錄
- 動態網頁
- 前端js邏輯加密和混淆
- 機器學習分析爬蟲行爲
- 只請求html,不請求css和js
- css代碼下毒(界面隱藏)
ps:Refer 從哪個網站跳轉過來
scrapy(pyspider) 底層異步IO庫
- 創建scrapy項目
- item pipline
- MiddleWares中間件 download Spider