from selenium import webdriver from selenium.webdriver.chrome.options import Options from bs4 import BeautifulSoup import time # 目标网站的 URL url = 'http://example.com/rank/list' # Chrome 浏览器配置 chrome_options = Options() chrome_options.add_argument('--disable-extensions') chrome_options.add_argument('--disable-gpu') chrome_options.add_argument('--no-sandbox') chrome_options.add_argument('--headless') chrome_options.add_argument('--disable-dev-shm-usage') # 启动 Chrome 浏览器 browser = webdriver.Chrome(options=chrome_options) # 发起第一页的请求并解析 HTML 标签 browser.get(url) time.sleep(3) # 等待 3 秒钟,等待 AJAX 加载完成 soup = BeautifulSoup(browser.page_source, 'html.parser') total_pages = soup.select('.ant-pagination-item:not(.ant-pagination-next):not(.ant-pagination-prev)')[-1]['title'] current_page = soup.select_one('.ant-pagination-item-active').text rank_list = parse_page(soup) # 发起所有页码的请求,并将结果存入列表中 for page in range(2, int(total_pages) + 1): if str(page) != current_page: # 模拟在浏览器中翻页操作 browser.execute_script(f'window.antDesignPro.current.delete("/rank/list?page={int(current_page)}")') # 删除当前页的数据 browser.execute_script(f'window.antDesignPro.current.jump("/rank/list?page={page}")') # 跳转到需要打开的页码 time.sleep(3) # 等待 3 秒钟,等待 AJAX 加载完成 soup = BeautifulSoup(browser.page_source, 'html.parser') page_data = parse_page(soup) rank_list += page_data current_page = page # 将所有分页数据合并成一个完整的 DataFrame 对象 all_data = merge_data(rank_list) # 关闭浏览器窗口 browser.quit() # 打印输出结果 print(all_data),注意:目标网站采用了 AJAX 或者 JavaScript 技术来进行分页加载数据,因此翻页时并没有刷新整个页面,也无法从html文本获得第一页以后的排名帮我修改代码,要求用到request和beautifulsoup等库,
时间: 2024-04-03 09:30:34 浏览: 161
好的,以下是修改后的代码,使用了 requests 和 BeautifulSoup 库来发送请求和解析 HTML 标签:
```python
import requests
from bs4 import BeautifulSoup
import pandas as pd
import time
def get_rank_list(url):
# 发起第一页的请求并解析 HTML 标签
res = requests.get(url)
soup = BeautifulSoup(res.text, 'html.parser')
total_pages = soup.select('.ant-pagination-item:not(.ant-pagination-next):not(.ant-pagination-prev)')[-1]['title']
current_page = soup.select_one('.ant-pagination-item-active').text
rank_list = parse_page(soup)
# 发起所有页码的请求,并将结果存入列表中
for page in range(2, int(total_pages) + 1):
if str(page) != current_page:
# 模拟在浏览器中翻页操作
headers = {
'Referer': url,
'X-Requested-With': 'XMLHttpRequest'
}
res = requests.delete(url, headers=headers, params={'page': int(current_page)}) # 删除当前页的数据
res = requests.get(url, headers=headers, params={'page': page}) # 跳转到需要打开的页码
soup = BeautifulSoup(res.text, 'html.parser')
page_data = parse_page(soup)
rank_list += page_data
current_page = page
# 等待 3 秒钟,等待 AJAX 加载完成
time.sleep(3)
# 将所有分页数据合并成一个完整的 DataFrame 对象
all_data = merge_data(rank_list)
return all_data
def parse_page(soup):
rank_list = []
for tr in soup.select('tbody tr'):
rank = tr.select_one('.rank').text.strip() # 排名
name = tr.select_one('.name').text.strip() # 名称
score = tr.select_one('.score').text.strip() # 得分
rank_list.append([rank, name, score])
return rank_list
def merge_data(rank_list):
df = pd.DataFrame(rank_list, columns=['rank', 'name', 'score'])
return df
if __name__ == '__main__':
url = 'http://example.com/rank/list'
all_data = get_rank_list(url)
print(all_data)
```
注意:目标网站采用了 AJAX 或者 JavaScript 技术来进行分页加载数据,因此需要在请求头中添加 `X-Requested-With` 和 `Referer` 参数,以模拟浏览器发送请求。此外,还需要等待 AJAX 加载完成后再解析 HTML 标签,可以使用 `time.sleep()` 函数来实现。
阅读全文