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

引言~~

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

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

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

过程~~

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

结果很意外,HTTP ERROR 404
虽然没有爬虫限制,但还是自觉遵守网络道德!

第二步盘代码

一开始我选择的是requests+BeautifulSoup,

import requests
from bs4 import BeautifulSoupurl = '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)

执行后显示的结果却没有预期的内容,仔细浏览后发现了问题所在:

<h1><strong>请开启JavaScript并刷新该页.</strong></h1>

我又在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 etreechrome_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)

运行结果

<Element html at 0x1ed30934c08>

俺也看不懂,俺也不敢问。就觉得没出错,那就试着继续往下走吧。试试能不能提取出内容。
接上代码

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 Optionschrome_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 htmldef 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即可获取完整内容。(具体原理也不懂,如有贵人,可为我解惑)

requests结果显示“请开启JavaScript并刷新该页”,selenium不用cookie解决相关推荐

  1. PHP curl 爬取反 爬的网站,请开启JavaScript并刷新该页.

    目标链接:http://www.pbc.gov.cn/zhengcehuobisi/125207/125213/125440/3876551/index.html 笔者查阅很多资料,大部分人说这样子需 ...

  2. 从服务器收到意料之外的响应,WordPress出现“从服务器收到预料之外的响应。此文件可能已被成功上传。请检查媒体库或刷新本页。”错误的解决方法...

    在WordPress网站上遇到图片上传问题?对于大多数初学者来说,图片上传错误可能会让人很困惑,因为无需您做任何其他操作就可以显示它们. 无法上传图片是WordPress中最常见的图片问题之一.幸运的 ...

  3. 关于QQ打开任何信息页面暂时无法显示 您可以点击刷新或稍后再试的解决办法。

    不吐槽,不bb,直接上车! 找到电脑的ie浏览器,如果找不到可以在左下角的搜索框里输入 ie 或者 Ctrl+s 在弹出来的搜索框里搜索 ie : 打开IE浏览器的工具-Internet选项-连接-局 ...

  4. python模拟访问js_python模拟http请求,返回“浏览器不支持javascript,请设置您的浏览器开启javascript支持”...

    需求 写一个可以自动获取"腾讯微博开发平台"申请中的oauth_verifier参数值的脚本. 正常情况下,需要人工从浏览器地址栏复制oauth_verifier的值,这个可以模拟 ...

  5. java 打开网页并运行脚本_各种浏览器开启JavaScript脚本方法

    1.单击右上角的齿轮图标.从出现的菜单中选择Internet 选项. 2.单击安全选项卡.单击窗口底部的自定义级别按钮,弹出安全设置对话框. 3.找到脚本目录.单击JAVA 小程序下的启用选项,选择此 ...

  6. AJAX+JavaScript无刷新检查用户名

    AJAX+JavaScript无刷新检查用户名是否可用2009-04-20 16:26   JavaScript 和 Ajax 代码 <script language="javascr ...

  7. 自动刷新_AutoRefresh插件:开启页面自动刷新!

    Auto Refresh 出于某种原因,在使用浏览器时我们可能需要每隔一段时间刷新一下网页. 例如在监视阅读量/下载量/评论,抢购新上市的手机和演唱会门票,查看网站更改进度这些场景中,如果都采用手动刷 ...

  8. 谷歌浏览器如何启用java小脚本_各种浏览器开启JavaScript脚本方法

    随着网站设计技术的发展,为了用户友好体验,大部分网站使用了JavaScript脚本设计,如果您的浏览器禁用或关闭的JavaScript支持,那么可能造成网站体验差或网站部分功能无法使用 下面提供10种 ...

  9. qq 浏览器不支持java_各种浏览器开启JavaScript脚本方法

    随着网站设计技术的发展,为了用户友好体验,大部分网站使用了JavaScript脚本设计,如果您的浏览器禁用或关闭的JavaScript支持,那么可能造成网站体验差或网站部分功能无法使用. 下面提供10 ...

  10. anybackup mysql_AnyBackup-Linux MySQL 云容灾失败,执行输出提示错误:Master 端未开启 MySQL BinLog,请开启 BinLog 后重新发起任务...

    关键字 MySQL BinLog 适用产品 AnyBackup 6.0.x 问题描述 执行 MySQL 云容灾失败,执行输出提示错误,点击查看详情显示下列错误信息: MySQL 容灾任务出现异常.(错 ...

最新文章

  1. unity 优秀开源项目
  2. 1815. 计算两点间的距离
  3. xshell可以连接上linux,但是xftp却连不上问题
  4. Python超越R,为何Python攀上数据科学巅峰?
  5. Java常见OutOfMemoryError
  6. joinquant : 通过query获取申万各级指数行情、估值等数据
  7. 删除word中自己插入的单行、双行线
  8. 深度:巨头覆盖之下中老年电商的创新突破策略-获客、选品、转化、粘性
  9. 从0到1-强化学习篇
  10. 2013-2-22 ACM-第三次月赛 1001 铺地毯
  11. (原创)修改BIOS让华硕Z87-A老主板支持NVMe硬盘启动(采坑实录)
  12. 手工重建复合文档(.doc;xls,ppt)文件头,修复文件全过程
  13. 梦想经不起等待,今天起就行动吧!
  14. 【AEC】【拍乐云Pano 】回声消除(AEC)怎么理解?
  15. mysql启动报没有发现index,log_bin.index not found 启动报错解决
  16. OSI模型 四层发现-nmap(诸神之眼)工具介绍
  17. Ubuntu aria2c 下载
  18. DNS服务器全攻略之一:基础介绍(区域委派 )
  19. Java进阶必读书籍推荐
  20. 测试工程师面试及其面试流程 —— 1

热门文章

  1. 电脑开机显示自动修复失败无法进入系统,解决方法(亲试有效!!!)
  2. knn.predict()报错 Expected 2D array, got 1D array instead: array=[18 90]. Reshape your data either usi
  3. 2019年 电赛C题 全国大学生电子设计竞赛试题解析与总结
  4. golang 支付宝小程序 登陆
  5. Pytorch——Conv2d、conv2d
  6. 黎曼猜想 量子计算机,理解黎曼猜想(一)背景
  7. 【.Net Core】编译时禁止自动生成netcoreapp文件夹
  8. Linux查看及测试网络
  9. 计算机里的二进制什么意思,二进制是什么,为什么计算机要使用二进制?
  10. face_recognition 人脸识别