今天无意间看到了很多纪念币,突然一股强烈的占有欲涌上心头。虽然手里捧着窝窝头,菜里没有一滴油,但是我还是胆大妄为地想去看看纪念币的发行。
一同乱七八糟的操作后,终于在中国人民银行-货币金银局里找到了‘普通纪念币’和‘贵金属纪念币’两个公告板。于是我立刻、毫不犹豫地点进了‘普通纪念币’,结果发现发布的公告数量不多,频率也很低。转念一想,每天都点点点的也太麻烦了,于是一个大胆的想法蹦了出来:爬它!
这是第一次对类似国家网站上手,心情还是很忐忑的。话不多说。开搞。
结果很意外,HTTP ERROR 404
虽然没有爬虫限制,但还是自觉遵守网络道德!
一开始我选择的是requests+BeautifulSoup,
import requests
from bs4 import BeautifulSoup
url = 'http://www.pbc.gov.cn/huobijinyinju/147948/147964/index.html'
headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.162 Safari/537.36',
}
res = requests.get(url,headers=headers)
res.encoding = 'utf-8'
soup = BeautifulSoup(res.text,'html.parser')
print(soup)
执行后显示的结果却没有预期的内容,仔细浏览后发现了问题所在:
请开启JavaScript并刷新该页.
我又在CSDN一通乱翻,找到了别人的解决办法python爬虫时爬取的html代码显示“请开启JavaScript并刷新该页”,简单来说就是带rookie访问。
加上rookie后果然获取了完整的内容。
之后进行的都很顺利。直到那一刻、那一秒的到来… 那一刹,我记起了BUG带来的恐惧。
虽然带rookie访问可以获取到想要的内容,但是每次rookie都要手动到网络中获取。非常的不方便。之后我又找到了自动获取rookie的方法,但是有个问题出现了~
res = requests.get(url,headers=headers)
cookies = requests.utils.dict_from_cookiejar(res.cookies)
(提一句,rookie一直在变)
因为一开始是无法知道rookie的,所以用不带rookie的headers,通过上面的代码获得了rookie,但是这个rookie是不能用于下一次的访问的,而下一次访问的意图正是为了带rookie而获得完整html内容。心态崩了呀!
突然,我想起来了前几天写的爬虫。用了selenium的driver,想试试能不能用这个方法搞定它。不试不知道,一试真奇妙。
一开始,只想试试水
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from lxml import etree
chrome_options = Options() # 实例化Option对象
chrome_options.add_argument('--headless') # 把Chrome浏览器设置为静默模式
chrome_options.add_argument('--disable-gpu') # 禁止加载图片
driver = webdriver.Chrome(options = chrome_options) # 设置引擎为Chrome,在后台默默运行
url = 'http://www.pbc.gov.cn/huobijinyinju/147948/147964/index.html'
driver.get(url)
html = etree.HTML(driver.page_source)
print(html)
运行结果
俺也看不懂,俺也不敢问。就觉得没出错,那就试着继续往下走吧。试试能不能提取出内容。
接上代码
extract_announcements_list = html.xpath('//*[@id="22786"]/div[2]/div[1]/table/tbody/tr[2]/td/table')
print(extract_announcements_list)
for i in extract_announcements_list:
announcement_date = i.xpath('./tbody/tr/td[2]/span/text()')
announcement_title = i.xpath('./tbody/tr/td[2]/font/a/@title')
announcement_link = i.xpath('./tbody/tr/td[2]/font/a/@href')
real_link = 'http://www.pbc.gov.cn' + announcement_link[0]
print(announcement_title,announcement_date,real_link)
一运行,您猜怎么着,得了! (其实写的时候,运行了一下,第一次没结果,心脏差点冻结···,如果你也是这样的话,再试几次哈!)
['中国人民银行与北京2022年冬奥会和冬残奥会组织委员会正式签署第24届冬季奥林匹克运动会纪念币发行协议'] ['2020-03-25'] http://www.pbc.gov.cn/huobijinyinju/147948/147964/3995344/index.html
['关于推迟2020年贺岁普通纪念币第二批次预约兑换工作的通知'] ['2020-02-11'] http://www.pbc.gov.cn/huobijinyinju/147948/147964/3969528/index.html
['关于2020年贺岁普通纪念币预约数量、兑换数量的公告(2020年1月21日)'] ['2020-01-21'] http://www.pbc.gov.cn/huobijinyinju/147948/147964/3963871/index.html
['关于2020年贺岁普通纪念币预约数量、兑换数量的公告(2020年1月20日)'] ['2020-01-20'] http://www.pbc.gov.cn/huobijinyinju/147948/147964/3963081/index.html
['关于2020年贺岁普通纪念币预约数量、兑换数量的公告(2020年1月19日)'] ['2020-01-19'] http://www.pbc.gov.cn/huobijinyinju/147948/147964/3961918/index.html
['关于2020年贺岁普通纪念币预约数量、兑换数量的公告(2019年12月23日)'] ['2019-12-23'] http://www.pbc.gov.cn/huobijinyinju/147948/147964/3944590/index.html
['关于2020年贺岁普通纪念币预约数量、兑换数量的公告(2019年12月20日)'] ['2019-12-20'] http://www.pbc.gov.cn/huobijinyinju/147948/147964/3943380/index.html
['2020年普通纪念币发行计划'] ['2019-12-17'] http://www.pbc.gov.cn/huobijinyinju/147948/147964/3941169/index.html
['关于世界文化和自然遗产——泰山普通纪念币预约数量、兑换数量的公告(2019年12月2日)'] ['2019-12-02'] http://www.pbc.gov.cn/huobijinyinju/147948/147964/3931119/index.html
['关于世界文化和自然遗产——泰山普通纪念币预约数量、兑换数量的公告(2019年11月29日)'] ['2019-11-29'] http://www.pbc.gov.cn/huobijinyinju/147948/147964/3930601/index.html
['关于世界文化和自然遗产——泰山普通纪念币预约数量、兑换数量的公告(2019年11月25日)'] ['2019-11-25'] http://www.pbc.gov.cn/huobijinyinju/147948/147964/3927100/index.html
['关于世界文化和自然遗产——泰山普通纪念币预约数量、兑换数量的公告(2019年11月22日)'] ['2019-11-22'] http://www.pbc.gov.cn/huobijinyinju/147948/147964/3925902/index.html
['中国人民银行公告〔2019〕第25号'] ['2019-11-11'] http://www.pbc.gov.cn/huobijinyinju/147948/147964/3916774/index.html
['关于中华人民共和国成立70周年普通纪念币预约数量、兑换数量的公告(2019年10月31日)'] ['2019-10-31'] http://www.pbc.gov.cn/huobijinyinju/147948/147964/3912092/index.html
['关于中华人民共和国成立70周年普通纪念币预约数量、兑换数量的公告(2019年10月30日)'] ['2019-10-30'] http://www.pbc.gov.cn/huobijinyinju/147948/147964/3911343/index.html
['关于中华人民共和国成立70周年普通纪念币预约数量、兑换数量的公告(2019年10月29日)'] ['2019-10-29'] http://www.pbc.gov.cn/huobijinyinju/147948/147964/3910593/index.html
['关于中华人民共和国成立70周年普通纪念币预约数量、兑换数量的公告(2019年10月28日)'] ['2019-10-28'] http://www.pbc.gov.cn/huobijinyinju/147948/147964/3909535/index.html
['关于中华人民共和国成立70周年普通纪念币预约数量、兑换数量的公告(2019年9月24日)'] ['2019-09-24'] http://www.pbc.gov.cn/huobijinyinju/147948/147964/3895153/index.html
['关于中华人民共和国成立70周年普通纪念币预约数量、兑换数量的公告(2019年9月23日)'] ['2019-09-23'] http://www.pbc.gov.cn/huobijinyinju/147948/147964/3894346/index.html
['关于中华人民共和国成立70周年普通纪念币预约数量、兑换数量的公告(2019年9月20日)'] ['2019-09-20'] http://www.pbc.gov.cn/huobijinyinju/147948/147964/3893381/index.html
啊!搞了大半天的关终于过了。窃喜···
既然已经能拿到数据了,那剩下的就很好办了,我就不细说了。具体的代码如下,有兴趣的小伙伴可以参考下
from datetime import date
from lxml import etree
import sys
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
chrome_options = Options() # 实例化Option对象
chrome_options.add_argument('--headless') # 把Chrome浏览器设置为静默模式
chrome_options.add_argument('--disable-gpu') # 禁止加载图片
driver = webdriver.Chrome(options = chrome_options) # 设置引擎为Chrome,在后台默默运行
url = 'http://www.pbc.gov.cn/huobijinyinju/147948/147964/index.html'
def driver_url():
driver.get(url)
html = etree.HTML(driver.page_source)
return html
def check_date(html):
today = str(date.today())
extract_announcements_list = html.xpath('//*[@id="22786"]/div[2]/div[1]/table/tbody/tr[2]/td/table')
for i in extract_announcements_list:
announcement_date = i.xpath('./tbody/tr/td[2]/span/text()')
if today == announcement_date[0]:
announcement_title = i.xpath('./tbody/tr/td[2]/font/a/@title')
announcement_link = i.xpath('./tbody/tr/td[2]/font/a/@href')
real_link = 'http://www.pbc.gov.cn'+announcement_link[0]
print_announcement(announcement_title,real_link)
else:
print('No %s new announcement.'%today)
sys.exit()
def print_announcement(title, link):
print(title, end=' ')
print(link)
if __name__ == '__main__':
res_html = driver_url()
check_date(res_html)
运行结果:
No 2020-04-24 new announcement.
selenium不需要rookie即可获取完整内容。(具体原理也不懂,如有贵人,可为我解惑)