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()
我想做什么:
- 加载该 URL
- 填写 2 个表单字段
- 提交
- 将 div id 统计信息打印到 python
- 在 15 分钟计时器上运行一个循环
- 如果 div 统计数据在循环时发生变化,则播放响亮的声音
请告诉我 best/fastest 以最少的编程经验执行此操作的方法。
一旦您理解为什么在加载页面时不显示第二个表单,就不难了。与 ASP 本身无关,而是由于 CSS 样式设置为 "display: none;" 并且只会在第一个选项 Select已满
这是您所追求的完整示例,在 Selenium 中实现,我相信它类似于机械化。
基本流程应该是:
- 加载网络浏览器并加载页面
- 找到第一个选项Select并填写
- 触发更改事件(我选择发送TAB键)并显示第二个选项Select
- 填写第二个Select找到提交按钮点击
- 为您从 div id=stats 文本
中获得的内容指定一个名称
比较上次获取的文本是否发生变化
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 中学习和实施您自己的)。
祝你好运!
你好,我是一名编程新手,我正在拼命地尝试让一些代码工作。 我真的找不到任何关于 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()
我想做什么:
- 加载该 URL
- 填写 2 个表单字段
- 提交
- 将 div id 统计信息打印到 python
- 在 15 分钟计时器上运行一个循环
- 如果 div 统计数据在循环时发生变化,则播放响亮的声音
请告诉我 best/fastest 以最少的编程经验执行此操作的方法。
一旦您理解为什么在加载页面时不显示第二个表单,就不难了。与 ASP 本身无关,而是由于 CSS 样式设置为 "display: none;" 并且只会在第一个选项 Select已满
这是您所追求的完整示例,在 Selenium 中实现,我相信它类似于机械化。
基本流程应该是:
- 加载网络浏览器并加载页面
- 找到第一个选项Select并填写
- 触发更改事件(我选择发送TAB键)并显示第二个选项Select
- 填写第二个Select找到提交按钮点击
- 为您从 div id=stats 文本 中获得的内容指定一个名称
比较上次获取的文本是否发生变化
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 中学习和实施您自己的)。
祝你好运!