最近由於工作需要開始接觸爬蟲,作爲一個小白,真的是像個屋頭蒼蠅,下面主要是針對我自己遇到的問題以及解決辦法做一下記錄。。。
①登錄網頁:包含用戶名、密碼、驗證碼,獲取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