使用过滤器抓取动态网站 python

如何解决使用过滤器抓取动态网站 python

我想抓取网站中的表格:https://www.feedtables.com/fr/content/table-dry-matter。问题是需要使用过滤器来获取所需的数据,否则您只能在进入网站后才能获得呈现的数据!任何帮助请!

这是我用来刮表的代码

import requests
import bs4 
import pandas as pd

URL = 'https://www.Feedtables.com/fr/content/table-dry-matter'
page = requests.get(URL)

soup = bs4.BeautifulSoup(page.text,'lxml')
cases = soup.find('table',class_= 'views-table sticky-enabled cols-16')
headers=[]
for i in cases.find_all('th'):
    headers.append(i.text.strip())

Data=[]
for i in cases.find_all('td'):
    Data.append(i.text.strip())

chunks = [Data[x:x+16] for x in range(0,len(Data),16)]
chunks

解决方法

有不同的方法

  1. 正如 burak 提到的 selenium 实现自动化

  2. 使用您的 requests 并将 parameters 添加到您的网址,因为您可以从上面的 feed_cat 获得 parameter_catselect桌子。 更新 - 查看编辑部分

我的示例循环遍历 feed_cat 选择框的选项

soup.find('select',attrs={'name': 'feed_cat'}).find_all('option')[1:3] (只需要第二个和第三个选项来演示)

然后用这些参数requests

page = requests.get(url+'?feed_cat='+option['value']+'&parameter_cat=All',headers=headers)

最后,您可以遍历数据以生成数据框。

注意:在一个请求中获取所有数据的简单方法 https://www.feedtables.com/fr/content/table-dry-matter?feed_cat=All&parameter_cat=All 行不通,您将收到服务器错误。

请求示例

import bs4
import requests
import pandas as pd

url = "https://www.feedtables.com/fr/content/table-dry-matter"
headers = {"user-agent": "Mozilla/5.0"}

page = requests.get(url,headers=headers)
soup = bs4.BeautifulSoup(page.text,'lxml')

data = []

for option in soup.find('select',attrs={'name': 'feed_cat'}).find_all('option')[1:3]:
    page = requests.get(url+'?feed_cat='+option['value']+'&parameter_cat=All',headers=headers)
    soup = bs4.BeautifulSoup(page.text,'lxml')
    
    cases = soup.select_one('table.views-table.sticky-enabled')
    
    th=[]
    td=[]
    for i in cases.find_all('th'):
        th.append(i.text.strip())
        
    for row in cases.find_all('tr')[1::2]:
        td.append([i.get_text(strip=True) for i in row.find_all('td')])   
            
    
    data.append({'cat' : option.text,'headers':th,'data':td})

df=pd.DataFrame(data[0]['data'],columns=data[0]['headers'])
df

输出(执行示例看起来更好;))

Matière première    MS %    MAT %   CB %    MGr %   MM %    MMins % NDF %   ADF %   Lignine %   ... GluDIS volaille g/kg    GlyDIS volaille g/kg    SerDIS volaille g/kg    ProDIS volaille g/kg    CED MJ/kg   ConsP g P/kg    CC g CO2eq/kg   Acid. mol H+eq/kg   Eutrophisation g PO4---eq/kg    OS m²yr/kg
0   Avoine  100 10.8    13.1    5.4 2.9 1.2 35.7    16.3    2.6 ... 15  4.2 4   4.9 3.02›››3.23›››  3.32›››3.32›››  555›››566›››    0.0139›››0.014›››   61.23›››61.52›››    0.0002›››0.0002›››
1   Avoine décortiquée  100 12.8    4.5 3.1 2.5 1.2 12.8    5.3 1.9 ... 19.9    5.2 5.1 6.3                     
2   Avoine floconnée    100 10.8    13.1    5.4 2.9 1.2 35.7    16.3    2.6 ... 15  4.2 4   4.9                     
3   Blé dur 100 16.4    3   2   2.1 0.05    15.9    4.2 1.3 ... 48.2    5.5 7.2 16.3    

编辑

将我的示例改进为以下更短的使用 pd.read_html()

import bs4
import requests
import pandas as pd

url = "https://www.feedtables.com/fr/content/table-dry-matter"
headers = {"user-agent": "Mozilla/5.0"}

page = requests.get(url,'lxml')

df_list = []

for url in [url+'?feed_cat='+option['value']+'&parameter_cat=All' for option in soup.find('select',attrs={'name': 'feed_cat'}).find_all('option')][1:3]:
    df_list.append(pd.read_html(url)[0])

df = df_list[0].dropna(how='all')
df
,

你不能用 bs4 处理它。但是你可以用 selenium 轻松做到。

#Download chromedriver from https://chromedriver.chromium.org/downloads  
#pip install selenium


    import time,os
    from selenium import webdriver
    from selenium.webdriver.common.keys import Keys
    
    chromedriver = "C:\\Program Files\Google\Chrome\Application\chromedriver"
    os.environ["webdriver.chrome.driver"] = chromedriver

    url_head = 'https://www.google.com/search?q="HOW+TO+USE+SELENIUM"'
    driver = webdriver.Chrome(chromedriver)
    driver.get(url)

这是您可以连接的方式。然后你可以像这样点击。

driver.find_element_by_xpath('//html/body/div[1]/div/ul/li[3]').click()

欲了解更多信息,请查看:https://selenium-python.readthedocs.io/locating-elements.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?