requests结果显示“请开启JavaScript并刷新该页”,selenium不用rookie解决

Selenium爬取可不使用cookie,即可获取完整html内容

引言~~

今天无意间看到了很多纪念币,突然一股强烈的占有欲涌上心头。虽然手里捧着窝窝头,菜里没有一滴油,但是我还是胆大妄为地想去看看纪念币的发行。

一同乱七八糟的操作后,终于在中国人民银行-货币金银局里找到了‘普通纪念币’和‘贵金属纪念币’两个公告板。于是我立刻、毫不犹豫地点进了‘普通纪念币’,结果发现发布的公告数量不多,频率也很低。转念一想,每天都点点点的也太麻烦了,于是一个大胆的想法蹦了出来:爬它!

这是第一次对类似国家网站上手,心情还是很忐忑的。话不多说。开搞。

过程~~

第一步当然是看看robots.txt了

结果很意外,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都要手动到网络中获取。非常的不方便。之后我又找到了自动获取rookie的方法,但是有个问题出现了~

res = requests.get(url,headers=headers)
cookies = requests.utils.dict_from_cookiejar(res.cookies)

(提一句,rookie一直在变)
因为一开始是无法知道rookie的,所以用不带rookie的headers,通过上面的代码获得了rookie,但是这个rookie是不能用于下一次的访问的,而下一次访问的意图正是为了带rookie而获得完整html内容。心态崩了呀!

Selenium解决

突然,我想起来了前几天写的爬虫。用了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即可获取完整内容。(具体原理也不懂,如有贵人,可为我解惑)

你可能感兴趣的:(python爬虫,python,selenium,html)