selenium模拟浏览器爬虫--以福建省土地使用权出让管理系统为例

来源:互联网 发布:sqlserver 2012 版本 编辑:程序博客网 时间:2024/06/10 17:38

 我们要获取网上土地出让结果公告的表格(见图1),网站网址:http://fjgpjy.fjgtzy.gov.cn/zpgpublicweb/PublicSysMsg/TradeResultListView.aspx,表格一共有349页,获取的内容存在名为land_right_transfer的数据库中

(一)配置环境

(1)首先安装selenium第三方库,我的已经安装成功了,返回信息如下;找到python安装文件夹 (见图2)

(2)我用的是chrome浏览器,其他浏览器同理,将自己浏览器对应版本的驱动下载下来放在python安装目录中,和python.exe同一个地方 (见图3),其中我的chrome驱动下载地址见博客:http://blog.csdn.net/cz9025/article/details/70160273 ,Firefox自己网上查到就行

(3)测试浏览器是否能正常打开

from selenium import webdriver
url = 'http://fjgpjy.fjgtzy.gov.cn/zpgpublicweb/PublicSysMsg/TradeResultListView.aspx'driver = webdriver.Chrome()
driver.get(url)

在python的IDLE中输入这几行代码,看是否有浏览器在自动运行并打开这个页面

(二)流程

 我打算一页一页第爬取,本页爬完后,就找到下一页“>"元素所在位置,再模拟click这个元素跳转到下一页,循环点击次数人工控制,由于知道这个网站表格共有348页,所以设置的点击次数要 for i in range(348): 

爬取思路是:获取每页的表格元素table,找到每一行,然后再循环每一行的每一列,抓取所有小表格的数据。但是需要注意的是,表格第四列数据并没有在文本内容上,文本内容都是以省略号的形式展示出来,真正的数据在第四列的title元素值上,见图4,所以不能再通过直接取元素文本形式来获得第四列的文本了

 rows[i].find_elements_by_tag_name('td')[j].text
我们需要找到第四列title元素属性,那么这就需要get_attribute()的方式来获得。还有一点值得注意的是我们不停地点击下一页,虽然设置了time.sleep()暂时让浏览
器暂停的方式,很有可能页面打开有问题,获取不了本页的table表单,程序报错。于是需要try来捕捉异常,当发生这样的情况时,就让浏览器休息一分钟,再刷新页面,由于
这个网站刷新后页面并不会退回,所以刷新后可继续爬虫。
PS:这样获取数据的确有点慢,而且还需要人工监控,防止停顿一分钟后还刷不出页面的情况
    然后我是没获取一行数据就传入数据库一次,并没有采用先获取后批量入库,这样可以保证错误发生时我们数据库中保存的有之前采集的数据

from selenium import webdriverimport pymysqlimport timedef login():    url = 'http://fjgpjy.fjgtzy.gov.cn/zpgpublicweb/PublicSysMsg/TradeResultListView.aspx'    driver = webdriver.Chrome()    driver.get(url)    time.sleep(10)    # index可以从你想开始的页面的下一页开始抓取    index = '1'    driver.find_element_by_xpath("//*[@id='_ctl0:ContentPlaceHolder1:pagination_input']").clear()    driver.find_element_by_xpath("//*[@id='_ctl0:ContentPlaceHolder1:pagination_input']").send_keys(index)    driver.find_element_by_xpath("//*[@id='_ctl0:ContentPlaceHolder1:pagination_btn']").click()    for i in range(348):  # 348是还剩抓取的页面数量,例如index从第10页开始(11页才真正开始抓)的,我们只需要抓到100页,那么此时range中的值就是90        button = driver.find_element_by_xpath(".//*[@id='_ctl0_ContentPlaceHolder1_pagination']//a[last()-1]")        button.click()        driver.implicitly_wait(40)        time.sleep(5)        try:            nextPage = driver.find_element_by_xpath("//table[@class='TableList']")            page = jiexitable(nextPage)        except Exception:            time.sleep(50)            driver.refresh()            nextPage = driver.find_element_by_xpath("//table[@class='TableList']")            page = jiexitable(nextPage)        print("现在已经运行到第%d页" % i)    return pagedef jiexitable(table1):    # 返回的result 格式长这样[[],[],[],..]    conn = pymysql.connect(host='localhost', user='root', passwd='123', db='tianyan', port=3306, charset='utf8')    cur = conn.cursor()  # 获取一个游标    sql = "INSERT INTO land_right_transfer (id, landnumber, size,landusage,tranprice,bider,Donetime,result)" \          " VALUES ( '%s', '%s', '%s','%s','%s','%s','%s','%s' )"    rows = table1.find_elements_by_tag_name('tr')    cols = rows[0].find_elements_by_tag_name('td')    result = [[0 for col in range(len(cols))] for row in range(len(rows))]    # 创建一个二维列表    for i in range(1, len(rows)):        for j in range(len(cols)):            result[i][j] = rows[i].find_elements_by_tag_name('td')[j].text            if j == 3:                result[i][j] = rows[i].find_elements_by_tag_name('td')[j].get_attribute('title')        cur.execute(sql % tuple(result[i]))        conn.commit()    cur.close()    conn.close()    return resultif __name__ == '__main__':    start = time.time()    tab1 = login()    end = time.time()    print(end-start)


阅读全文
0 0
原创粉丝点击