工作中经常需要采集一些网站上的表数据,之前都是手工一条一条记录。学完python总感觉用的太少,于是想到不妨用python做个小爬虫去爬取。
百度了下,使用Python爬取网页表数据怎么爬取,我再稍微修改下。结果尝试以后发现,百度的方法并不适用该网站。百度上的方式是使用BeautifulSoup去爬取,但这种方法只适合静态页面的表数据,如果表数据跟本文中提到的上交所的类似,是采用JS脚本动态生成的话,则无法使用。所以只能自己完全重写。之前做过一段时间的自动化,会使用webdriver,就用它了! 看了下页面表格的元素,还好,有规律可循。先写获取一个页面所有元素的文本内容的函数。
# 存储编号 table_num_array = browser.find_elements_by_xpath('//td[@class="td_no_break text-align-center"]') # 存储名称 table_name_array = browser.find_elements_by_xpath('//td[@class="td_break_word_7 "]') # 存储状态 table_status_array = browser.find_elements_by_xpath('//td[@class="td_break_word_2 "]') # 存储地区 table_area_array = browser.find_elements_by_xpath('//td[@class="td_no_break pd_style "]') # 存储行业 table_industry_array = browser.find_elements_by_xpath('//td[@class="td_break_word_3 "]') # 存储发行商 table_stockbroker_array = browser.find_elements_by_xpath('//td[@class="td_break_word_9 "]') # 存储律所 table_law_firm_array = browser.find_elements_by_xpath('//td[@class="td_break_word_8 "]') # 存储会计师事务所 table_cpa_array = browser.find_elements_by_xpath('//td[@class="td_break_word "]') # 存储日期 table_date_array = browser.find_elements_by_xpath('//td[@class="td_no_break "]')接下来就是将爬取到的数据写入到文件当中了。
output = ' '.join(list(s)).encode('utf-8') print output f.write(output+'\n') # 获取需要翻页的页数 def get_pages(): page_no_array = browser.find_elements_by_xpath('//a[@class="dataList1_container_paginationNumLink"]') return len(page_no_array)最后,写一个main函数将代码整合
if __name__ == '__main__': pages = get_pages() f = open(file_name, 'wb') get_page() for k in range(pages): browser.find_element_by_xpath('//a[@class="paging_next"]').click() get_page() f.close() browser.quit()最后说一下遇到的问题: 1、获取表格数据文本时,部分文本存在换行,去掉换行试错了很久,最后发现只能使用replace函数而无法使用strip函数去掉换行。这点以后要注意!
for i in range(len(table_num_array)): # 此处用replace函数去掉带<br>换行,不能用strip()函数 s = table_num_array[i].text, table_name_array[i].text.replace('\n', ''), table_status_array[i].text.replace('\n', ''), \ table_area_array[i].text.replace('\n', ''), table_industry_array[i].text.replace('\n', ''), table_stockbroker_array[ i].text.replace('\n', ''), table_law_firm_array[i].text.replace('\n', ''), table_cpa_array[i].text.replace('\n', ''), \ table_date_array[2 * i].text, table_date_array[2 * i + 1].text output = ' '.join(list(s)).encode('utf-8') print output f.write(output+'\n')2、写入文本时,刚开始想写csv文件,于是百度了一个csv的写入方法,结果发现写入的文件每一个汉字都接一个空格,还有乱码的问题,最后放弃了,采用最原始的open ,write的方法搞定。
特此记录下此过程,以便以后跟踪学习进度。
