使用Python从动态Web数据库中刮取数据

时间:2015-02-20 18:31:51

标签: python selenium web-scraping beautifulsoup scrapy

我是Python新手,目前正在尝试弄清楚如何从此网络中抓取数据:

https://www.entsoe.eu/db-query/consumption/mhlv-a-specific-country-for-a-specific-month

我不确定我是否使用Scrapy,BeautifulSoup或Selenium。在2012 - 2014年期间,每个月和每天都需要特定国家/地区(例如德国 - 德国)的数据。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:3)

您可以使用requests(用于维护网络抓取会话)+ BeautifulSoup(用于HTML解析)+正则表达式来解决它,以便提取包含{内部所需数据的javascript变量的值{1}}标记和ast.literal_eval()用于从js列表中创建python列表:

script

打印:

from ast import literal_eval
import re

from bs4 import BeautifulSoup
import requests


url = "https://www.entsoe.eu/db-query/consumption/mhlv-a-specific-country-for-a-specific-month"
payload = {
    'opt_period': '0',
    'opt_Country': '12',  # 12 stands for DE here
    'opt_Month': '1',
    'opt_Year': '2014',
    'opt_Response': '1',
    'send': 'send',
    'opt_period': '0'
}
headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.111 Safari/537.36'}

with requests.Session() as session:
    session.headers = headers
    session.get(url)

    response = session.post(url, data=payload)

    soup = BeautifulSoup(response.content)
    script = soup.find('script', text=re.compile(r'Ext.onReady')).text

    data = literal_eval(re.search(r"var myData = (.*?);", script, re.MULTILINE).group(1))
    for row in data:
        print row

特定硒的方法会更少"魔法",但我认为这对你来说已经足够了(并且只需要很少的研究工作就可以提出问题)。