ASP 页面上的网页抓取 w/Mechanize and/or BeautifulSoup4

Web Scraping w/Mechanize and/or BeautifulSoup4 on ASP pages

你好,我是一名编程新手,我正在拼命地尝试让一些代码工作。 我真的找不到任何关于 ASP scraping/filling 领域的好教程,然后提交然后使用内容。

到目前为止,这是我的代码:

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 统计数据在循环时发生变化,则播放响亮的声音

请告诉我 best/fastest 以最少的编程经验执行此操作的方法。

一旦您理解为什么在加载页面时不显示第二个表单,就不难了。与 ASP 本身无关,而是由于 CSS 样式设置为 "display: none;" 并且只会在第一个选项 Select已满

这是您所追求的完整示例,在 Selenium 中实现,我相信它类似于机械化。

基本流程应该是:

  1. 加载网络浏览器并加载页面
  2. 找到第一个选项Select并填写
  3. 触发更改事件(我选择发送TAB键)并显示第二个选项Select
  4. 填写第二个Select找到提交按钮点击
  5. 为您从 div id=stats 文本
  6. 中获得的内容指定一个名称
  7. 比较上次获取的文本是否发生变化

    a) 如果是,请发出提示音并关闭驱动程序页面等。

    b) 如果不是,设置一个调度器(我用的是Python的Event's Scheduler,又是运行抓取功能...

就是这样! Easy, ok code time -- 我用英国 + Working Holiday 对进行测试:

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,但您确实需要了解基础知识)和他们所有的元素如何一起工作。

您确实需要从基础阅读 => 摘要 => 代码 => 经验 => 循环学习,编程没有捷径或最快的方法。

希望这对您有所帮助(我真的希望您不要只是复制和粘贴我的,而是顺便在 mechanize 中学习和实施您自己的)。

祝你好运!