Python实战系列-东方财富网显示研报报错最新解决方案

最近在查东方财富网最新研报的时候,发现报错,第一怀疑就是html又变了,果然是的:so.eastmoney.com/Yanbao/s?ke... 以前的代码

python 复制代码
# # 获取多页信息

# In[ ]:


from selenium import webdriver
import re
import requests


# In[20]:


browser = webdriver.Chrome()

data_all = ''
for i in range(10):
    url = 'http://so.eastmoney.com/Yanbao/s?keyword=格力电器&pageindex=' + str(i+1)
    browser.get(url)
    data = browser.page_source
    data_all = data_all + data  # 拼接每一页网页源代码
    
# 正则提取
p_href = '<div class="list-item">.*?<a href="(.*?)"'
href = re.findall(p_href, data_all)

href


# In[21]:


for i in range(len(href)):  # 这里的href就是多个页面提取出的href了
    # 1.请求研报跳转页面
    browser = webdriver.Chrome()
    browser.get(href[i])
    data = browser.page_source
    browser.quit()
    
    # 2.提取跳转页面中的标题和PDF下载网址
    p_name = '<h1>(.*?)</h1>'
    p_href_pdf = '<a class="rightlab" href="(.*?)">【点击查看PDF原文】</a>'
    name = re.findall(p_name, data)
    href_pdf = re.findall(p_href_pdf, data)
    
    # 3.利用3.7节相关知识点下载PDF文件
    res = requests.get(href_pdf[0])  # 研报文件比较大,下载需要等待一些时间
    path = '格力研报\\' + name[0] + '.pdf'
    file = open(path, 'wb')
    file.write(res.content)
    file.close()

报错就是找不到元素,于是查看元素修改如下 这里面有几个地方需要注意: 1、之前的分页已经不work,需要模拟点击下一页来获取,首先要确定总共有多少页:

python 复制代码
p_page = '<a href="#" data-pi="2"'
pageCount = len(re.findall(p_page, browser.page_source))

2、模拟点击下一页事件:

python 复制代码
if i > 0:
    browser.find_element(by=By.XPATH,value='//*[@id="app"]/div[3]/div[1]/div[3]/div/a[5]').click()
    time.sleep(3)  # 这里必须要加3秒的延迟,因为有个刷新的动作需要等待下

3、注意延迟时间一定要加

python 复制代码
time.sleep(3)  # 这里必须要加3秒的延迟,因为有个刷新的动作需要等待下

4、p_href的获取已经变了,已经html已经更新,改成如下:

python 复制代码
# 正则提取
# p_href = '<div class="list-item">.*?<a href="(.*?)"'

p_href = '<div class="notice_item_link" tracker-eventcode="dfcfwss.ssh.ryq.nrdj" tracker-extinfo="' + "{'LocModuleKey': '研报','searchKeyWord': '格力电器'}" + '"><a href="(.*?)"'
href = re.findall(p_href, data_all)

5、加入re.S忽略换行

python 复制代码
    name = re.findall(p_name, data, re.S)
    print(name[0].replace("\n","").strip())
    href_pdf = re.findall(p_href_pdf, data)

6、注意文件名称的特殊处理

python 复制代码
path = '格力研报\\' + name[0].replace("\n","").strip() + 

以下完整代码:

python 复制代码
#!/usr/bin/env python
# coding: utf-8

# # 获取单页研报信息

# In[1]:


from selenium import webdriver
import re
import requests
from selenium.webdriver.common.by import By

headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36'}


# In[13]:


# # 获取多页信息

# In[ ]:


from selenium import webdriver
import re
import requests
import time


# In[20]:


browser = webdriver.Chrome()

url = 'http://so.eastmoney.com/Yanbao/s?keyword=格力电器'
browser.get(url)
time.sleep(5)
data_all = ''

p_page = '<a href="#" data-pi="2"'
pageCount = len(re.findall(p_page, browser.page_source))

for i in range(pageCount):
    # //*[@id="app"]/div[3]/div[1]/div[3]/div/a[5]
    if i > 0:
        browser.find_element(by=By.XPATH,value='//*[@id="app"]/div[3]/div[1]/div[3]/div/a[5]').click()
        time.sleep(3)  # 这里必须要加3秒的延迟,因为有个刷新的动作需要等待下

    # browser.find_element(by=By.CLASS_NAME, value='gotoform').send_keys(i+1)
    # browser.find_element(by=By.CLASS_NAME, value='gotoform').click()

    # url = 'http://so.eastmoney.com/Yanbao/s?keyword=格力电器&pageindex=' + str(i+1)
    # browser.get(url)
    data = browser.page_source
    # print('start')
    print(data)
    # print('end')
    data_all = data_all + data  # 拼接每一页网页源代码
    
# 正则提取
# p_href = '<div class="list-item">.*?<a href="(.*?)"'

p_href = '<div class="notice_item_link" tracker-eventcode="dfcfwss.ssh.ryq.nrdj" tracker-extinfo="' + "{'LocModuleKey': '研报','searchKeyWord': '格力电器'}" + '"><a href="(.*?)"'
href = re.findall(p_href, data_all)

href


# In[21]:


for i in range(len(href)):  # 这里的href就是多个页面提取出的href了
    # 1.请求研报跳转页面
    print(i)
    browser = webdriver.Chrome()
    browser.get(href[i])
    data = browser.page_source
    browser.quit()
    
    # 2.提取跳转页面中的标题和PDF下载网址
    #p_name = '<h1>(.*?)</h1>'
    p_name = '<h1>(.*?)</h1>'
    p_href_pdf = '<a class="rightlab" href="(.*?)">【点击查看PDF原文】</a>'
    #p_href_pdf = '<a style="color: #039; text-decoration: underline; font-family: 宋体; font-size: 14px;" href="(.*?)"><span class ="icon icon_pdf valign-middle"></span>查看PDF原文</a>'
    name = re.findall(p_name, data, re.S)
    print(name[0].replace("\n","").strip())
    href_pdf = re.findall(p_href_pdf, data)
    
    # 3.利用3.7节相关知识点下载PDF文件
    res = requests.get(href_pdf[0])  # 研报文件比较大,下载需要等待一些时间
    path = '格力研报\\' + name[0].replace("\n","").strip() + '.pdf'
    file = open(path, 'wb')
    file.write(res.content)
    file.close()
相关推荐
乾元11 分钟前
LLM 自动生成安全基线与等保合规初稿——把“网络工程事实”转译为“可审计的制度语言”
运维·网络·人工智能·python·安全·架构
全栈陈序员13 分钟前
【Python】基础语法入门(二十四)——文件与目录操作进阶:安全、高效地处理本地数据
开发语言·人工智能·python·学习
是有头发的程序猿16 分钟前
Python爬虫实战:面向对象编程构建高可维护的1688商品数据采集系统
开发语言·爬虫·python
摸鱼仙人~19 分钟前
企业级 RAG 问答系统开发上线流程分析
后端·python·rag·检索
serve the people26 分钟前
tensorflow tf.nn.softmax 核心解析
人工智能·python·tensorflow
癫狂的兔子33 分钟前
【BUG】【Python】eval()报错
python·bug
啃火龙果的兔子34 分钟前
java语言基础
java·开发语言·python
masterqwer34 分钟前
day42打卡
python
不会飞的鲨鱼36 分钟前
抖音验证码滑动轨迹原理(很难审核通过)
javascript·python
我命由我1234536 分钟前
Python 开发问题:No Python interpreter configured for the project
开发语言·后端·python·学习·pycharm·学习方法·python3.11