以下是代码
from selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdriver.common.by import By
from lxml import etree
from time import sleep
import pandas as pd
from bs4 import BeautifulSoup
def get_row(li):
list1 = []
l1_1 = li.find_all('a')
l1_2 = li.find_all('td')
for x in l1_1:
list1.append(x.string)
for y in l1_2[2:5]:
list1.append(y.string)
return list1
# 实例化一个浏览器对象
wd = webdriver.Chrome(executable_path='./chromedriver')
# 让浏览器发起一个指定url的请求
wd.get('http://www.fortunechina.com/fortune500/c/2022-08/03/content_415683.htm')
# 设置隐式等待时间
wd.implicitly_wait(20)
# 获取浏览器当前界面的动态页面源码数据
page_text = wd.page_source
# 解析企业名称
soup = BeautifulSoup(page_text, "html.parser")
# 建立空列表
list_ji = []
max_page = 2
### 检测测数据是否加载完成
def data_exsist():
if soup.find_all('tr',role="row") :
global list_ji
l1 =soup.find_all('tr',role="row")
for j in range(0,50) :
list_ji.append(get_row(l1[j]))
else:
sleep(10)
if soup.find_all('tr', role="row"):
l1 = soup.find_all('tr', role="row")
for j in range(0, 50, 1):
list_ji.append(get_row(l1[j]))
else:
wd.refresh()
sleep(5)
data_exsist()
### 主程序
def get_all_data() :
global wd,list_ji ###声明全局变量
for i in range(1,int(max_page)+1) :
if i != int(max_page)-1 :
data_exsist()
print(f'当前第{i}页')
wd.find_element(By.LINK_TEXT, '下页').click()
else :
l1 = soup.find_all('tr', role="row")
for line in (0,50) :
try :
list_ji.append(get_row(l1[line]))
except Exception :
break
###报错就说明所有数据都拿完了,直接退出即可
get_all_data()
column = ["企业名称", "营业收入", "利润", "国家"]
result = pd.DataFrame(list_ji, columns=column)
pd.set_option('display.max_rows', None) # 显示pandas所有行
print(result)
wd.quit()
出现了这样的问题
根据您提供的代码,我注意到您的代码存在一些问题:
在get_all_data函数中,您正在迭代要爬取的页面数,但是在循环迭代的过程中,您并没有等待数据加载完成再继续下一页的操作。因此,您需要在点击下一页按钮之后,等待新页面加载完成再进行数据抓取。
在data_exsist函数中,您的判断条件soup.find_all('tr',role="row")可能会返回多余的行,导致数据获取不全。您可以通过检查每行数据的格式和内容,来过滤掉不需要的行。
基于上述问题,我修改了您的代码,希望能够帮助您实现按顺序抓取数据和翻页。请注意,以下代码可能需要根据您的实际情况进行进一步调整和优化:
from selenium import webdriver
from selenium.webdriver.common.by import By
from time import sleep
import pandas as pd
def get_row(li):
list1 = []
l1_1 = li.find_all('a')
l1_2 = li.find_all('td')
for x in l1_1:
list1.append(x.string)
for y in l1_2[2:5]:
list1.append(y.string)
return list1
# 实例化一个浏览器对象
wd = webdriver.Chrome(executable_path='./chromedriver')
# 让浏览器发起一个指定url的请求
wd.get('http://www.fortunechina.com/fortune500/c/2022-08/03/content_415683.htm')
# 设置隐式等待时间
wd.implicitly_wait(20)
# 获取总页数
max_page = wd.find_element(By.CLASS_NAME, 'pagenumber').text.split('/')[1]
# 建立空列表
list_ji = []
def data_exist():
# 等待数据加载完成
while True:
l1 = wd.find_elements(By.CSS_SELECTOR, 'tr[role="row"]')
if len(l1) > 0 and len(l1[0].find_all('td')) == 6:
break
sleep(1)
for j in range(0, 50):
list_ji.append(get_row(l1[j]))
def get_all_data():
global wd, list_ji
for i in range(1, int(max_page)+1):
print(f'正在爬取第{i}页...')
data_exist()
if i == int(max_page):
break
wd.find_element(By.LINK_TEXT, '下一页').click()
sleep(2)
get_all_data()
column = ["企业名称", "营业收入", "利润", "国家"]
result = pd.DataFrame(list_ji, columns=column)
pd.set_option('display.max_rows', None) # 显示pandas所有行
print(result)
wd.quit()
希望这能够帮助您解决问题。如果您有任何疑问,请随时问我。