前面有介紹幾篇使用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。
3.發送完帳號密碼後,跳到parse_login,之後再繼續跑start_requests
4.最後回到parse,這邊我自己湊了一個連結去指定月份,
正常程序應該是去判斷頁面的資料,然後取得連結,
但這種連結都固定的,我也只要一個資料就直接湊網址了。
碰到問題一覽:
1-1.除了使用logging 、python Document,也可以用self.log 將資料印出來,
不建議用print,我一用print就會出現 Spider error processing 的錯誤,
但我之前用還沒問題…真的是很怪。
1-2.要將log記錄下來的話,需指定檔案名稱
logging.basicConfig(filename='AWS.log')
後面的參數可參考上面的連結
2.yield 需要理解一下,可參考 icodding愛程式
3.日期函數 ,因為我需要月份一定要兩位數,所以用%m 其他參數可參考 stactoverflow 、Python-Document
4.登入後要連去其他的網頁,需要發送一個請求出去。
scrapy.Request(url,callback=self.assignURL)
如果是使用scrapy shell的話則是使用
fetch的方式
6.撈資料前,先用 scrapy shell,測試看看取不取的到值
7.如果要確認程式跑到哪一個地方掛掉,可以用fiddler,看連線的數據
沒有留言:
張貼留言