ready? 学习永无止境,秃头警告! 随着从入门到入狱,静态网页已经满足不了哥的需求,自己太作死了! 所以,决定用selenium获取所有页数,经历过一天的偷摸爬滚终究成就以下源码! 步骤:
- 分析静态网页
- 找出’下一页‘的按钮,通过selenium模拟点击
- 保存为csv文件
首先,以以下网页为例 http://fundf10.eastmoney.com/jjjz_005669.html 接着,右键点击检查进入开发者模式,开始对网页进行分析。 一页有20行数据,放在tbody标签中,只需遍历提取每一个tr标签即可 CSS_SELECTOR路径如下:
'#jztable > table > tbody > tr'
紧接着,分析每一条tr标签的数据 提取比较简单,
found_list['净值日期'] = item.find('td:nth-child(1)').text()
found_list['单位净值'] = item.find('td:nth-child(2)').text()
found_list['累计净值'] = item.find('td:nth-child(3)').text()
found_list['日增长率'] = item.find('td:nth-child(4)').text()
分析完静态网页后,要让浏览器模拟点击下一页,通过选择元素定位其路径
'#pagebar > div.pagebtns > label:nth-child(8)'
注意:
'#pagebar > div.pagebtns > label:nth-child(9)'
到第31页后,路径会变化,代码会报错,加入except selenium.common.exceptions.NoSuchElementException语句可接着遍历下面的页数
注意,页面显示41页,但其路径在每一页其路径会发生变化,所以建议在第一页就开始定位,由于最后一页并没有以下圈住的标签,所以总的页数total_page_num+3才能遍历到41页。 这个小小的插曲玩弄了我一整天,强迫症的我不能放弃每一页。 小伙伴,你是否坚持看到了这里,接下来便是源码时间。 show time!
import time
import selenium.common.exceptions
import csv ,codecs
import re
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait
from pyquery import PyQuery as pq
url='http://fundf10.eastmoney.com/jjjz_005669.html'
browser=webdriver.Chrome()
wait = WebDriverWait(browser, 10)
def get_url():
browser.get(url)
total_page_str = wait.until(
EC.presence_of_element_located(
(By.CSS_SELECTOR, '#pagebar > div.pagebtns > label:nth-child(8)'))).text
total_page_num = int(re.search("(\d+)", total_page_str).group(1))
try:
for j in range(1,total_page_num+3):
html = browser.page_source
doc = pq(html)
items = list(doc('#jztable > table > tbody > tr').items())
for item in items:
found_list = {}
found_list['净值日期'] = item.find('td:nth-child(1)').text()
found_list['单位净值'] = item.find('td:nth-child(2)').text()
found_list['累计净值'] = item.find('td:nth-child(3)').text()
found_list['日增长率'] = item.find('td:nth-child(4)').text()
yield found_list
btn = browser.find_element_by_css_selector('#pagebar > div.pagebtns > label:nth-child(9)')
browser.execute_script('arguments[0].click();', btn)
time.sleep(2)
except selenium.common.exceptions.NoSuchElementException:
html = browser.page_source
doc = pq(html)
items = list(doc('#jztable > table > tbody > tr').items())
for item in items:
found_list = {}
found_list['净值日期'] = item.find('td:nth-child(1)').text()
found_list['单位净值'] = item.find('td:nth-child(2)').text()
found_list['累计净值'] = item.find('td:nth-child(3)').text()
found_list['日增长率'] = item.find('td:nth-child(4)').text()
yield found_list
btn = browser.find_element_by_css_selector('#pagebar > div.pagebtns > label:nth-child(7)')
browser.execute_script('arguments[0].click();', btn)
time.sleep(2)
if __name__=='__main__':
f=codecs.open('天天基金网.csv','w+',encoding='utf-8-sig')
filename=['净值日期','单位净值','累计净值','日增长率']
writer=csv.DictWriter(f,fieldnames=filename)
writer.writeheader()
for i in get_url():
print(i)
writer.writerow(i)
效果图:
|