Pages - Menu

2018年11月1日 星期四

[Python]Scrapy 模擬登入及流程

這次的範例是要撈AWS的雲端主機價格費用,
前面有介紹幾篇使用Scrapy的簡單方法,
這次要搞的是Login的方式。
以下繼續



先列出完整程式碼,等等再解釋

import sys
import io
import scrapy
import datetime
import logging
from urllib import parse as urlparse
from scrapy.selector import HtmlXPathSelector
from scrapy.http import Request, FormRequest

sys.stdout = io.TextIOWrapper(sys.stdout.buffer,encoding='utf8')
class DemoSpider(scrapy.Spider):
     name = "AWS"
     allowed_domains = ["service.ecloudvalley.com"]
     start_urls = [
         "https://service.ecloudvalley.com/bill_usage_list.php"
     ]
     login_url = "https://service.ecloudvalley.com/bill_login.php"
    logging.basicConfig(filename='AWS.log')

     def parse(self, response):
         logging.info('Get Page')
         logging.info('Index Page:'+response.url)
        year = datetime.date.today().year
         month = datetime.date.today().strftime('%m')
         month = '10'
         url = 'https://service.ecloudvalley.com/bill_usage_list.php?searchym=' + str(year) + '%2F' + str(month)
         # self.log(url)
         if url:
             yield scrapy.Request(url,callback=self.assignURL)

     def assignURL(self,response):
         money = response.xpath('//table[contains(@class,"table")]/tr[2]/td/text()').extract()
         logging.info('money:'+str(money))
         # self.log(response.url)
    def start_requests(self):
         yield scrapy.Request(self.login_url, callback = self.login)
    
     def login(self, response):
         yield scrapy.FormRequest.from_response(
             response,
             formdata={'billb':'ACCOUNT','billc':'PASSWORD'},
             callback=self.parse_login)
    def parse_login(self,response):
         logging.info(">>>>>>>>>>>parse_login")
         yield from super().start_requests()

看到這一串列表,
要先知道爬蟲程式是怎樣運行的,
目前玩出來的結果,
1. start_quest –>  parse  :發送請求的時候,直接去呼叫 login
2.在login的時候,我這邊偷了一個懶,直接丟帳號密碼到下一個步驟。
這邊需要先到原網址查一下該欄位的ID。
image
3.發送完帳號密碼後,跳到parse_login,之後再繼續跑start_requests
4.最後回到parse,這邊我自己湊了一個連結去指定月份,
正常程序應該是去判斷頁面的資料,然後取得連結,
但這種連結都固定的,我也只要一個資料就直接湊網址了。

碰到問題一覽:
1-1.除了使用loggingpython Document,也可以用self.log 將資料印出來,
不建議用print,我一用print就會出現   Spider error processing 的錯誤,
但我之前用還沒問題…真的是很怪。
1-2.要將log記錄下來的話,需指定檔案名稱

    logging.basicConfig(filename='AWS.log')

後面的參數可參考上面的連結
2.yield 需要理解一下,可參考 icodding愛程式
3.日期函數 ,因為我需要月份一定要兩位數,所以用%m 其他參數可參考 stactoverflowPython-Document
4.登入後要連去其他的網頁,需要發送一個請求出去。

scrapy.Request(url,callback=self.assignURL)

如果是使用scrapy shell的話則是使用
fetch的方式 
6.撈資料前,先用 scrapy shell,測試看看取不取的到值
7.如果要確認程式跑到哪一個地方掛掉,可以用fiddler,看連線的數據

沒有留言:

張貼留言