工作中经常需要采集一些网站上的表数据,之前都是手工一条一条记录。学完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的方法搞定。
特此记录下此过程,以便以后跟踪学习进度。