2015-07-27 3 views
1

OK, используя Python 3.4 и beautifulsoup4 на окнах 7 VM. Возникли проблемы с очисткой данных, возникающих в результате выбора с выпадающим списком. Как опыт обучения, я пытаюсь написать скребок, который может выбрать 4-летний вариант на этой странице: www.nasdaq.com/symbol/ddd/historical и распечатать строки результирующей таблицы. Пока что он просто распечатывает таблицу по умолчанию по умолчанию 3 месяца вместе с некоторым нежелательным файлом в начале, которого я не хочу. В конце концов, я хотел бы очистить эти данные и записать их в DB с помощью mysql python коннектора, но сейчас я просто хотел бы выяснить, как сделать выбор из 4-х лет в выпадающем списке. (Также, хотел бы избавиться от кодировки текста, что заставляет его быть в формате b'blahblah»Мой код до сих пор:.Скремблирование динамических веб-страниц с использованием Python 3.4 и beautifulsoup

from bs4 import BeautifulSoup 
import requests 

url = 'http://www.nasdaq.com/symbol/ddd/historical' 
with requests.Session() as session: 
    session.headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.115 Safari/537.36'} 
    response = session.get(url) 
    soup = BeautifulSoup(response.content) 
    data = { 
     'ddlTimeFrame': '4y' 
    } 
    response = session.post(url, data=data) 
    soup = BeautifulSoup(response.content) 
    for mytable in soup.find_all('tbody'): 
     for trs in mytable.find_all('tr'): 
      tds = trs.find_all('td') 
      row = [elem.text.strip().encode('utf-8') for elem in tds] 
      print (row) 

Я не получаю ошибки, но не печатает вне 4 года. Спасибо за ваше время/терпение/помощь!

ответ

3

Я не знаю, что вы делали, но когда я назвал ваш сценарий, у меня есть ответ - однако это был сайт по умолчанию с информацией о последние 3 месяца

Чтобы получить данные за последние 4 года, вам нужно немного изменить свой запрос. Если вы посмотрите на запрос XHR в инструментах разработчика вашего браузера, вы увидите, что данные, отправленные на сервер 4y|false|DDD вместо 'ddlTimeFrame': '4y'.

Второе изменение является content-type заголовок, который нужно отправить вместе с вашим POST запросу:

session.headers['content-type'] = 'application/json' 
data = "4y|false|DDD" 

С этими двумя небольшими изменениями вы получите желаемые данные.

+0

Спасибо, Гайба, работал как шарм. Кроме того, если вы или кто-либо еще со временем на руках и желание помочь учащемуся, который учится, какие-либо советы по использованию коннектора python для сохранения этих данных в mysql db? СПАСИБО СНОВА, друг мой! – user3157868

+1

Есть много учебников, как вы можете это достичь. Например здесь: http://dev.mysql.com/doc/connector-python/en/connector-python-example-connecting.html – GHajba

Смежные вопросы