簡體   English   中英

在ASP頁上使用機械化和/或BeautifulSoup4進行Web爬網

[英]Web Scraping w/Mechanize and/or BeautifulSoup4 on ASP pages

您好,我是一名編程n00b,並極力嘗試使某些代碼正常工作。 我真的找不到關於ASP刮取/填充字段並提交然后使用內容的任何優秀教程。

到目前為止,這是我的代碼:

import mechanize
import re

url = 'http://www.cic.gc.ca/english/work/iec/index.asp'
br = mechanize.Browser(factory=mechanize.RobustFactory())
br.set_handle_robots(False)
br.addheaders = [('User-agent', 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.1)    Gecko/2008071615 Fedora/3.0.1-1.fc9 Firefox/3.0.1')]
br.open(url)
response = br.response().read()

我正在嘗試做的是:

  1. 加載該URL
  2. 填寫2個表單字段
  3. 提交
  4. 將div id統計信息打印到python中
  5. 在15分鍾的計時器上運行循環
  6. 如果div統計信息中的任何內容在循環時發生變化,則播放聲音很大

請告訴我以最少的編程經驗來做到這一點的最佳/最快方法。

一旦理解了為什么頁面加載后沒有顯示第二個表單,就沒有那么困難了。 與ASP本身無關,而是由於CSS樣式設置為“ display:none;”。 並且僅在第一個“選項選擇”已填滿后才有效。

這是在Selenium中實現的功能的完整示例,我相信它類似於機械化。

基本流程應為:

  1. 加載網絡瀏覽器並加載頁面
  2. 找到第一個選項選擇並填寫
  3. 觸發更改事件(我選擇發送TAB鍵),並顯示第二個“選項選擇”
  4. 填寫第二個“選擇並找到”提交按鈕,然后單擊它
  5. 為您從div id = stats文本獲得的內容分配名稱
  6. 比較文本是否從上次獲取更改

    a)如果是,請執行BEEP並關閉驅動程序頁面等。

    b)如果否,請設置一個調度程序(我使用Python的Event的調度程序 ,然后再次運行抓取功能...

而已! 簡單,確定的代碼時間-我使用英國+工作假期對進行測試:

import selenium.webdriver
from selenium.webdriver.common.keys import Keys
import sched, time

driver = selenium.webdriver.Firefox()
url = 'http://www.cic.gc.ca/english/work/iec/index.asp'
driver.get(url)

html_content = ''
# construct a scheduler
s = sched.scheduler(time.time, time.sleep)

def crawl_me():
    global html_content
    driver.refresh()
    time.sleep(5) # wait 5s for page to be loaded

    country_name = driver.find_element_by_name('country-name')
    country_name.send_keys('United Kingdom')
    # trick's here to send a TAB key to trigger the change event
    country_name.send_keys(Keys.TAB)

    # make sure the second Option Select is active (none not in style)
    assert "none" not in driver.find_element_by_id('category_dropdown').get_attribute('style')

    cateogory_name = driver.find_element_by_name('category-name')
    cateogory_name.send_keys('Working Holiday')

    btn_go = driver.find_element_by_id('submit')
    btn_go.send_keys(Keys.RETURN)

    # again, check if the content has been loaded
    assert "United Kingdom - Working Holiday" not in driver.page_source

    compared_content = driver.find_element_by_id('stats').text
    # here we will end this script if content has changed already
    if html_content != '' and html_content != compared_content:
        # do whatever you want to play the beep sound
        # at the end exit the loop
        driver.close()
        exit(-1)
    # if no changes are found, trigger the schedule_crawl() function, like recursively
    html_content = compared_content
    print html_content
    return schedule_crawl()

def schedule_crawl():
    # set your time interval here, 15*60 = 15 minutes
    s.enter(15*60, 1, crawl_me, ())
    s.run() # and run it of course

crawl_me()

坦白地說,這非常簡單明了,但是確實需要您完全了解html / css / javascript(在這種情況下不是javascript,但是您需要了解基本知識)及其所有元素如何協同工作。

您確實需要從基本的閱讀中學習=>摘要=>代碼=>經驗=>循序漸進, 編程沒有捷徑或最快的方法。

希望這會有所幫助(我真的希望您不僅要復制並粘貼我的知識,而且還要通過機械化的方式學習和實現自己的知識)。

祝好運!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM