python selenium自动化测试之牛刀小试——爬虫

pip -install selenium

cmd安装

仍需geckodriver配适浏览器,建议使用firefox


以下是爬虫实例,博主还不会用markdown,看官将就一下

博主尽量学习好的排版

在本实例中,待爬网页中需要下载的杂志,需要点击十年制年份范围,弹出十个年份,再次点击可得到本年期刊数据

如下结构:


2000-2010:

                   2000:

                   2001:

                   ...

                   2010:

                              ISSUE01:

                              ISSUE02:

                              ....


对于需要的400+份期刊,findway函数准确找到其所在的十年,单年,ISSUE,随后进入下载。


def ini():
    profile_directory = r'C:\Users\eddatt\AppData\Roaming\Mozilla\Firefox\Profiles\XXXXXXX.default'

    profile = webdriver.FirefoxProfile(profile_directory)

    pythonq启动geckodriver,再启动浏览器,默认出厂配置,这里的配置文件使得网页直接下载PDF而不是在线打开


    
    browser = webdriver.Firefox(profile)
    time.sleep(5)
    browser.get('THE_URL_YOU_WANT_TO_CRAWL')
    time.sleep(10)
    cur = browser.current_window_handle

    使用句柄类进行换页操作    


    browser.find_element_by_link_text("Informs").click()

    最重要的定位操作:有element和elements版本


    time.sleep(15)
    handles=browser.window_handles
    handles.remove(cur)
    browser.close()
    browser.switch_to_window(handles[0])
    return browser


def findway(num):
    issuelist = [6 for i in range(65)]
    issuelist[0] = 5
    issuelist[1] = 5
    issuelist[2] = 4
    issuelist[3] = 4
    issuelist[19] = 7
    issuelist[28] = 7
    issuelist[40] = 8
    issuelist[46] = 7
    issuelist[58] = 7
    issuelist.reverse()
    issuelist=[0]+issuelist
    for i in range(66):
        if(i>0):
            issuelist[i]+=issuelist[i-1]
    top_layer= [0,7,17,27,37,47,57,65]
    top_botton=[-1,7,18,29,40,51,62]
    top_reflec=[]
    botton=[0,0]
    botton[0]=top_botton[find(find(num,issuelist),top_layer)]
    botton[1]=botton[0]+find(num,issuelist)-top_layer[find(find(num,issuelist),top_layer)]+1
    return botton


def find(num,list):
    for i in range(len(list)-1):
        if(num>=list[i] and num             return i


def click(browser,num):
    botton=findway(num)
    ex=browser.find_elements_by_xpath("//a[@class='title expander ']")
    time.sleep(25)
    if(botton[0]>0):
        ex[botton[0]].click()
    ex[botton[1]].click()
    l=browser.find_elements_by_xpath("//span[@class='loiIssueCoverDateText']")
    time.sleep(10)
    l[num+6].click()
    
if __name__ == '__main__':
    import time

    载入时间模块控制进程,对于浏览器运行的每一行代码,需要时间给其反映,代码敲得太快有时网站还没有打开,浏览器还没有反映过来,就会报错,或者一动不动
    from selenium import webdriver
    
    for i in [380+j for j in range(12)]:
        print(i)
        browser=ini()
        time.sleep(25)
        click(browser,i)
        time.sleep(15)
        p=browser.find_elements_by_partial_link_text("PDF")
        time.sleep(8)
        for i in range(len(p)):
            p[i].click()
            time.sleep(8)


        time.sleep(100)
        browser.quit()


嘛,被拉着学做爬虫也有点意思的,主要是之前有过网页制作经验,知道如何定位网页元素,建议想爬虫的同志先学习一下html页面结构基础


爬虫经验总结:

1.使用chrome检查寻找网页并定位网页元素是存在风险的,检查中浏览器向服务器发送的请求开头中认为你是移动端设备,对于一些网站,电脑上显示的内容与移动端显示的内容相差很大,建议定位出错时,仔细查看网页源代码

2.网速过慢,网页反映不及,各种报错,经常使用sleep,但是time.sleep()是一个硬性的睡眠指标,固定睡一定时间。问题是:1,睡得太多,爬虫速度极低,2.睡的不够,各种报错。基于此尝试使用了隐式等待,发现并没有卵用,只能看网速和经验了,隐式等待留作一个问题

3. 定位元素可以使用class, id, xpath, element, name, value等等,但是注意定位最好选择和样式无关的指标,如果有一些网页基础就会知道,class指的是样式,很可能重复导致错误定位


爬虫感谢:

虫师,他的博客是这个,https://www.cnblogs.com/fnng/

从他的博客中学到了很多,推荐一下,但是不知道他出的书怎么样,估计也不会差


SD,爬虫元凶,并且疯狂制造错误,不过在debug中也学到不少



待解决问题:

1.隐式等待

2.浏览器状态判断交互操作

3.反反cookie反爬

你可能感兴趣的:(python)