由于肺炎假期在家太无聊,开始学习模式。
今天终于实现了把央行货币政策执行报告全部爬下来。高兴之余写篇博客记录下。
需要安装的项目有selenium和pyautogui。
代码分3个步骤:
1. 配置selenium chrome
2. 在央行第一个页面把所有执行报告的链接拿下来
3. 进到一个个页面把PDF文件下下来
1. 配置selenium chrome
一般教程上说的PhantomJS已经停止更新了,所以要么用Firefox要么用chrome
option = webdriver.ChromeOptions()
#option.add_argument('--headless') # 开启无界面模式
option.add_argument('log-level=3') #不显示一般的LOG信息
prefs = {'profile.default_content_settings.popups': 0, 'download.default_directory': 'd:\\'}
option.add_experimental_option('prefs', prefs)#配置默认的保存地址
driver=webdriver.Chrome(executable_path=r'C:\mysniper\chromedriver',chrome_options=option)#新建一个浏览器页面
driver.implicitly_wait(10)#默认等待加载完成页面,最长等10秒
上面的代码就最后两行是必须的,前面的配置没有也没关系。最后一句特别说一下,这个的意思是后面调用find_element_by***的时候要等待页面加载完成才执行,不然可能由于页面有JS,没加载完就不能完全显示。参数10的意思是最长等10秒。
2. 在央行第一个页面把所有执行报告的链接拿下来
driver.get("http://www.pbc.gov.cn/zhengcehuobisi/125207/125227/125957/index.html")
da=driver.find_elements_by_class_name("unline")
reportHref=[]
reportData=[]
reportPDFlink=[]
for item in da:
itemHref=item.find_element_by_partial_link_text(u"执行报告").get_attribute("href")
if itemHref=="http://www.pbc.gov.cn/zhengcehuobisi/125207/125227/125957/125985/2889622/index.html":
continue
reportHref.append(itemHref)
itemData=item.find_element_by_class_name("hui12").get_attribute('textContent')
reportData.append(itemData)
把下面画红线的链接一个个存起来,顺便把报告发布的时间也存起来。
3. 进到一个个页面把PDF文件下下来
for i in range(0,len(reportHref)-1):
driver.get(reportHref[i])
driver.implicitly_wait(10)
links=driver.find_elements_by_xpath("//a")
for link in links:
if link.get_attribute("href")!=None and link.get_attribute("href").find("pdf")>0:
#print(link.get_attribute("href"))
#print(link.get_attribute("textContent"))
actions = ActionChains(driver)
actions.context_click(link)
actions.perform()
pyautogui.typewrite(['down','down','down','down','enter','enter'])
time.sleep(1)
filename=reportData[i]+".pdf"
pyautogui.write(filename, interval=0.25)
pyautogui.press('enter')
time.sleep(1)
pyautogui.press('esc')
time.sleep(15)
这里一个个打开前面保存的页面。把所有链接筛出来,其中不为空且带有PDF字样的链接就是我们要的文件地址。但是如果直接点击,默认的文件名不是我们想要的。因此需要用到pyautogui。
首先通过selenium里的动作链ActionChains建立一个左键点击的事件。后面就靠pyautogui了。
pyautogui.typewrite()函数可以模拟一系列注册的键盘事件,按下有键后点4次下就选中了“链接另存为”。
pyautogui.write(filename, interval=0.25)用于模拟键盘输入,而且还可以模拟间隔时间。其实就是在另存为的框里输入文件名。
pyautogui.press('enter')顾名思义按回车健。这样就保存了。因为我的浏览器会再弹出一次保存画面,所以多了一次esc。
然后等15秒保证下载完成再进入下一个页面。