從零起步系統入門Python爬蟲工程師(二)-慕課實戰 csdn論壇(靜態網頁) 京東項目(動態網頁) scrapy(pyspider) 底層異步IO庫

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()

注意項:

  1. F12查看‘元素’找到元素用Selector 的xpath解析出來(解析出來的繼續調用xpath 注意 需要加上當前路徑 ”.//div“)

  2. 自動加上域名 parse.urljson(domain,url)

  3. 當ORM有id屬性的時候就默認當做Primarykey(如果沒有回自動生成一個id),當對數據進行更新操作的時候不能直接調用save方法,調用topic.save(force_insert=True)#有id默認是更新 此時又沒有這條數據就會導致更新失敗

  4. author_url.split("/")[-1] -1表示的是最後一個

  5. 字符串轉時間格式datetime.strptime(time_str,”%Y-%m-%d %H:%M:%S")

  6. 解析的時候有時候會碰到返回403之類的不正常錯誤 是反爬的問題,需要做相應處理

  7. 把字符串轉爲list ast.literal_eval(node_str)

京東項目(動態網頁)

  1. 瞭解哪些數據時動態加載

    1. 數據加載更慢

    2. 刪除js代碼,然後本地顯示html,看哪些數據沒有顯示就是動態加載的

  2. 如何獲取數據

    1. 分析

      1. 在控制檯的XHR(異步請求)看下有沒有請求

      2. 查詢js文件,js文件返回的是否有頁面的字段

      3. 分析(看js源文件)構造參數,js請求

    2. selenium自動化

      1. pip install selenium
      2. 查看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)

  1. 獲取session/cookies
    1. request.session()
    2. 登錄返回res.cookies.get_direct()
    3. 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 鬆開鼠標
用一個函數模擬人的拖動

驗證碼識別 服務商

  1. 雲打碼 ——> 比較準
  2. 超級鷹——>識別類型多

反爬&反反爬

  • user-agent ————> install fake-useragent 隨機
  • ip訪問頻率限制 ————>ip代理 免費(不穩定) 阿布雲
  • 必須登錄
  • 動態網頁
  • 前端js邏輯加密和混淆
  • 機器學習分析爬蟲行爲
  • 只請求html,不請求css和js
  • css代碼下毒(界面隱藏)
ps:Refer 從哪個網站跳轉過來

scrapy(pyspider) 底層異步IO庫

  • 創建scrapy項目
  • item pipline
  • MiddleWares中間件 download Spider
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章