最近在查东方财富网最新研报的时候,发现报错,第一怀疑就是html又变了,果然是的:https://so.eastmoney.com/Yanbao/s?keyword=%E5%AE%81%E5%BE%B7%E6%97%B6%E4%BB%A3
以前的代码
# # 获取多页信息
# 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,需要模拟点击下一页来获取,首先要确定总共有多少页:
p_page = '<a href="#" data-pi="2"'
pageCount = len(re.findall(p_page, browser.page_source))
2、模拟点击下一页事件:
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、注意延迟时间一定要加
time.sleep(3) # 这里必须要加3秒的延迟,因为有个刷新的动作需要等待下
4、p_href的获取已经变了,已经html已经更新,改成如下:
# 正则提取
# 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忽略换行
name = re.findall(p_name, data, re.S)
print(name[0].replace("\n","").strip())
href_pdf = re.findall(p_href_pdf, data)
6、注意文件名称的特殊处理
path = '格力研报\\' + name[0].replace("\n","").strip() +
以下完整代码:
#!/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()
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/164025.html