爬蟲遇到的問題以及解決辦法

最近由於工作需要開始接觸爬蟲,作爲一個小白,真的是像個屋頭蒼蠅,下面主要是針對我自己遇到的問題以及解決辦法做一下記錄。。。

登錄網頁:包含用戶名、密碼、驗證碼,獲取cookie

網頁源碼格式:

<script type=text/javascript src=static/js/manifest.37a2ecbb1d1b7e6c9ada.js></script>

放在<script></script>之間的是文本類型(text)。
javascript是告訴瀏覽器裏面的文本是屬於javascript腳本

網上的教程 通過標籤路徑獲取,顯然這是不可行的。

   from selenium import  webdriver
   import requests

   driver = webdriver.Chrome()
   driver.get("http://mydomain.com/login") 

    name_label = driver.find_element_by_id("clientname1")
    name_label.send_keys(" ") # 防止發送不成功
    name_label.clear()
    name_label.send_keys(my_name)

通過查看,發現登錄連接爲:http://mydomain.com/api/vue/login_login?KEYDATA=myname,mg,pwd,mg,veri 

KEYDATA後面是用戶名、密碼、驗證碼,顯然用戶名和密碼是已知的,最不好得到的是驗證碼,

這裏我用selenium模擬登錄,當現實登錄界面後,用

from selenium import  webdriver
import requests

driver = webdriver.Chrome()

driver.get("http://domain.com/GWC/#/login") 

check=input()
print(check)
url_dl = 'http://domain.com/api/vue/login_login?KEYDATA=name,mg,pwd,mg,' +check
driver.get(url_dl)
seleniumCookies = driver.get_cookies()
cookie = [item["name"] + "=" + item["value"] for item in seleniumCookies]
cookMap = ';'.join(item for item in cookie)

#把獲得的cookie:seleniumCookies,放到header中

self.header['Cookie']=cookMap

②內容爬取:

登錄後頁面並不是直接進入要爬取內容頁面,

我要爬取的內容url爲:http://mydomain.com/api/vue/overhaul/getRailOverhaullistPage.do

查資料瞭解到:Vue.js 的目標是通過儘可能簡單的 API 實現響應的數據綁定組合的視圖組件。不管了,我只需要知道url就行了。有了上面的cookie 就可以進行內容爬蟲了

③翻頁爬取

網上找了一圈,基本上都是獲取下一頁的連接,然後發送請求。

這裏所有的數據連接都是http://mydomain.com/api/vue/overhaul/getRailOverhaullistPage.do

不同的地方是,currentPage參數不同,同時從totalPage中可以看出總共有多少頁數據,currentResult中可以看出當前頁有多少條記錄。

那麼我可以通過設置formdata的參數值來確定爬取的數據頁

如何獲取totalPage值來控制爬取的次數?

這裏先爬取一次,獲取totalPage

def parseLoginRes(self, response):
   
    # 登錄之後,開始爬取數據
    yield scrapy.FormRequest(
        # 鋼軌大修數據,通過接口形式爬取
        url="http://mydomain.com/api/vue/overhaul/getRailOverhaullistPage.do",
        # 不允許頁面跳轉來測試
        meta={'usedSelenium': False, 'dont_redirect': True},
        formdata={"selectFlag": "1", "showCount": "10", "currentPage": str(1)},
        headers=self.header,
        callback=self.pageTurn,
        errback=self.errorHandle,
        dont_filter=True
    )

然後再進行while循環爬取。 

def pageTurn(self,response):
     
    self.totalpage = json.loads(response.text)['data']['page']['totalPage']  # 獲取總共有多少頁需要爬取
    self.currentpage = 1
    while True:  # spider 獲取輸入的response 並且
        if self.currentpage > self.totalpage:
            break
        yield scrapy.FormRequest(
            # 鋼軌大修數據,通過接口形式爬取
            url="http://mydomain.com/api/vue/overhaul/getRailOverhaullistPage.do",
            # 不允許頁面跳轉來測試
            meta={'usedSelenium': False, 'dont_redirect': True},
            formdata={"selectFlag": "1", "showCount": "10", "currentPage": str(self.currentpage)},
            headers=self.header,
            callback=self.parseLoginStatusRes,
            errback=self.errorHandle,
            dont_filter=True
        )
        self.currentpage += 1  

 

④導入自定義py文件,總是現實不存在,

import sys
sys.path.append(r"file_path")#指定自定義模塊的位置
import file_name

這樣就不會有問題了,

如果是上級目錄中文件:

import sys
import os
sys.path.append(os.path.dirname(__file__) + os.sep + '../') #將下面的相對路徑轉化爲絕對路徑
from ..items import SpiderrailItem

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章