python+selenium自动化下载

这是记录写的selenium爬虫的一篇文章,简陋到能用就行。

网页

现今通用的网页形式是html+css做静态网页,javascript做动态网页。其中html为标记语言,css为样式语言。
例如:https://github.com/g107904/tiny-html/blob/master/test.html

<style type = "text/css" >
		.headtitle
		{
			font-size:xx-large;
			font-family:"Times New Roman";
			text-align:center;
		}
		.subtitle
		{
			font-size:x-large;
		}
		.blank
		{
			height:100px;
		}
		.eachone
		{
			width:20%;
			height:400px;
			float:left;
		}
		.blank_
		{
			width :4%;
			height:400px;
			float :left;
		}
		.bottoms
		{
			width :50%;
			float:left;
			text-align:center;
 
		}
	</style>

 

style是html中标记,包含的内容为css,说明字体,长宽等

若是静态网页,则可由一层一层的html标记解成树结构,方便浏览器渲染。
而若是添加了动态的Javascript语句,则仍是以树为中心,只是在JS事件执行后会改变树中元素及结构。
而最终呈现在用户面前的,是html文件,当事件改变的时候,展现的也是html文件,或者说是浏览器解析后的html文件。

所以,我们可以通过模拟人执行Javascript语句,获得执行后的网页,而后就可以通过操作html网页来完成任务。

xml、xpath、xquery

xml和html一样,也是标记语言,他们都是SGML的子集。区别在于HTML预定义标记,而XML可拓展且自描述。
我们不去关心xml的具体形式,主要看基于xml的查询语言xpath、xquery,他们同样适用于html。

XPath 利用路径表达式来选择文档的部分,路径表达式是用“/”分隔开的一系列步骤,对于树而言,可以看成从某一结点到定位结点的路径。
其中,选择谓词可以跟在路径中的任何一步后面, 放在[ ]中,可以通过“@”访问属性。
特别注意,路径中的一步可以走向前一步生成的结点的父结点, 兄弟, 祖先和后裔,而不仅仅是子结点。

xquery是查询语句,它包含了xpath,且像其他语言一样,包含操作的语句,是图灵完备的。
其类似于数据库中的sql语言,具体而言,其使用for … let … where … order by … return …
其中,
for <> SQL from
where <> SQL where
order by <> SQL order by
return <> SQL select
for子句使用Xpath表达式.

selenium

selenium是一个用于网页自动化测试的工具,其现在支持使用chrome,只是需要去下载chrome驱动。
下载完驱动,放在环境变量的任一文件夹中都可。

driver = webdriver.Chrome() 可启动浏览器。
driver.get(url)获取网页。
element=driver.find_elements_by_xpath(“/”)定位元素
element.click() 模拟点击
driver.current_window_handle搜索当前网页

    chrome_opt = Options()      # 创建参数设置对象.
    prefs = {"download.default_directory": "G:","download.prompt_for_download": False,'profile.default_content_setting_values.images': 2,}
    chrome_opt.add_experimental_option("prefs", prefs)
    #chrome_opt.add_argument('--headless')   # 无界面化.
    chrome_opt.add_argument('--disable-gpu')    
    chrome_opt.add_argument('--window-size=1366,768')   
    driver = webdriver.Chrome(chrome_options=chrome_opt)        
 
    #driver.get('https://freemidi.org/download3-24031-0-2-1-nomeansno')   
    #driver.find_element_by_xpath('//a[text()="Download MIDI"]').click()
    #driver.find_element_by_xpath('//a[text()="Download MP3*"]').click()
    ll = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z']
    url = 'https://freemidi.org/songtitle-'
    for t in ll:  
        driver.get(url+t)
        elist = driver.find_elements_by_xpath('//div[@class="row-title"]/child::a')
        strlist = []
        for elem in elist:
            strlist.append(elem.text)
        for st in strlist:
            if t == 'a':
                break
            search_window=driver.current_window_handle
            try:
                driver.find_element_by_xpath("//a[contains(text(),'%s')]" % st).click()
            except:
                titl = driver.title
                ass = 'Titles'
                if ass in titl:
                    continue
                driver.back()
                driver.find_element_by_xpath("//a[contains(text(),'%s')]" % st).click()
            search_window=driver.current_window_handle  #此行代码用来定位当前页面
            time.sleep(20)
            driver.find_element_by_xpath('//a[text()="Download MIDI"]').click()
            title = driver.title
            if title == "freemidi.org":
                driver.back()
                search_window=driver.current_window_handle
            driver.find_element_by_xpath('//a[text()="Download MP3*"]').click()
            title = driver.title
            if title == "freemidi.org":
                driver.back()
            time.sleep(180)
            driver.back()
            time.sleep(20)
 
        pagelink = driver.find_elements_by_xpath('//div[@class="header-nav-pages-container"]/child::a')
        pages = []
        i = 0
        while i < len(pagelink)/2:
            if  t == 'a' and i < 15:
                i = i+1
                continue
            pages.append(pagelink[i].text)
            i = i + 1
        for page in pages:
            if t == 'a' and page == '2':
                continue
            search_window=driver.current_window_handle
            driver.find_element_by_xpath("//a[text()='%s']" % page).click()
            time.sleep(20)
            search_window=driver.current_window_handle
            elist = driver.find_elements_by_xpath('//div[@class="row-title"]/child::a')
            strlist = []
            for elem in elist:
                strlist.append(elem.text)
            for st in strlist:
                search_window=driver.current_window_handle
                if st == '12, 51':
                    continue
                try:
                    driver.find_element_by_xpath("//a[contains(text(),'%s')]" % st).click()
                except:
                    titl = driver.title
                    ass = 'Titles'
                    if ass in titl:
                        continue
                    driver.back()
                    search_window=driver.current_window_handle
                    driver.find_element_by_xpath("//a[contains(text(),'%s')]" % st).click()
                title = driver.title
                if title == "freemidi.org":
                    driver.back()
                    continue
                search_window=driver.current_window_handle  #此行代码用来定位当前页面
                time.sleep(20)
                try:
                    driver.find_element_by_xpath('//a[text()="Download MIDI"]').click()
                except:
                    print("error")
                title = driver.title
                if title == "freemidi.org":
                    driver.back()
                    search_window=driver.current_window_handle
                try:
                    driver.find_element_by_xpath('//a[text()="Download MP3*"]').click()
                except:
                    print("error")
                title = driver.title
                if title == "freemidi.org":
                    driver.back()
                time.sleep(180)
                driver.back()
                time.sleep(20)
            #driver.back()
            time.sleep(20)

发表评论

电子邮件地址不会被公开。 必填项已用*标注