2015-08-08 1 views
3

Я очищаю данные с сайта WSJ Biggest Gainers. Я новичок в Python, поэтому я уверен, что это просто. Я просто не могу найти ясного ответа на это.Скребковые данные из нескольких предыдущих дат в веб-сайтах WSJ

В настоящее время мой код загружает данные только с одной страницы, но я хочу, чтобы он возвращался к предыдущим дням данных, например, и find_all или выбирал данные из диаграмм. Как изменить URL-адрес в коде для этого? Я использую Python 3.4.3 и bs4.

Приятно, что URL-адреса сайтов предыдущих дней отличаются только несколькими номерами.

Например, Это последняя пятница http://online.wsj.com/mdc/public/page/2_3021-gainnnm-gainer-20150731.html?mod=mdc_pastcalendar

Это последний четверг

http://online.wsj.com/mdc/public/page/2_3021-gainnnm-gainer-20150730.html?mod=mdc_pastcalendar

В идеале я хотел бы быть в состоянии изменить месяц, день или год, если я хочу , а затем зациклируйте разные URL-адреса страниц, чтобы получить нужные мне данные.

Вот мой код:

import requests 
from bs4 import BeautifulSoup 


url = 'http://online.wsj.com/mdc/public/page/2_3021-gainnyse-gainer.html' 

r = requests.get(url)   #downloads website html 

soup = BeautifulSoup(r.content)   #soup calls the data 

v_data = soup.select('.text') 

for symbol in v_data: 
    print(symbol.text) 

Я просто хочу, чтобы петли этой функции в течение последних X дней. Я попытался составить список URL-адресов для запуска без везения. Это также большая работа, чтобы составить список URL-адресов, поэтому, если бы я мог использовать что-то вроде% s или% d для месяца, года и даты, тогда это было бы лучше.

+0

Я предполагаю, что BeautifulSoup не поддерживает JavaScript по умолчанию, но мне интересно, требует ли ваш целевой сайт. Вы пробовали просматривать целевой сайт с отключенным JS? – halfer

+0

Нет, нет. Я не должен был беспокоиться о JS, хотя, если бы мог найти способ посмотреть URL-адрес, потому что все, что мне нужно изменить, это 4 числа в предыдущих URL-адресах, соответствующих месяцу и дню (например,0801 за август 1) –

+0

Ах, ваш ответ смутил меня сейчас - похоже, вы не думаете, что JavaScript имеет значение для веб-соскабливания (это очень важно). Я думаю, вы имеете в виду, что скребок отлично работает для одной страницы, и вы просто хотите генерировать новые URL-адреса. Это правильно? – halfer

ответ

3

Вы можете использовать дату начала, а затем - = в день, используя timedelta проходящего дату в URL с str.format и STRFTIME:

import requests 
from bs4 import BeautifulSoup 
from datetime import date,timedelta 
start_url = "http://online.wsj.com/mdc/public/page/2_3021-gainnnm-gainer-{}.html?mod=mdc_pastcalendar" 

start = date.today() 
for _ in range(5): 
    url = start_url.format(start.strftime("%Y%m%d")) 
    start -= timedelta(days=1) 
    r = requests.get(url)   #downloads website html 
    soup = BeautifulSoup(r.content)   #soup calls the data 
    v_data = soup.select('.text') 
    for symbol in v_data: 
     print(symbol.text) 

Просто создать любую дату вы хотите. Если вы хотите конкретную дату начала, просто создать Задан объект:

import requests 
from bs4 import BeautifulSoup 
from datetime import datetime,timedelta 
start_url = "http://online.wsj.com/mdc/public/page/2_3021-gainnnm-gainer-{}.html?mod=mdc_pastcalendar" 

start = datetime(2015,07,31) 
for _ in range(5): 
    print("Data for {}".format(start.strftime("%b %d %Y"))) 
    url = start_url.format(start.strftime("%Y%m%d")) 
    start -= timedelta(days=1) 
    r = requests.get(url)   #downloads website html 
    soup = BeautifulSoup(r.content)   #soup calls the data 
    v_data = soup.select('.text') 
    for symbol in v_data: 
     print(symbol.text.rstrip()) 
    print(" ") 

Выход:

Data for Jul 31 2015 

| 
WHAT'S THIS? 
| 
1 

MoneyGram International (MGI) 
2 

YRC Worldwide (YRCW) 
3 

Immersion (IMMR) 
4 

Skywest (SKYW) 
5 

Vital Therapies (VTL) 
6 

.......................... 

Data for Jul 30 2015 

| 
WHAT'S THIS? 
| 
1 

H&E Equipment Services (HEES) 
2 

Senomyx (SNMX) 
3 

eHealth (EHTH) 
4 

Nutrisystem (NTRI) 
5 

Open Text (OTEX) 
6 

LivePerson (LPSN) 
7 

Sonus Networks (SONS) 
8 

FormFactor (FORM) 
9 

Pegasystems (PEGA) 
10 

Town Sports International Holdings (CLUB) 
11 

FARO Technologies (FARO) 
12 

Presbia (LENS) 
13 

Если вы хотите включить в будние дни и до сих пор получить n дней, то нам нужно добавить немного больше логики.

import requests 
from bs4 import BeautifulSoup 
from datetime import datetime, timedelta 

start_url = "http://online.wsj.com/mdc/public/page/2_3021-gainnnm-gainer-{}.html?mod=mdc_pastcalendar" 

start = datetime(2015, 7, 31) 


def only_weekdays_range(start, n): 
    i = 0 
    wk_days = {0, 1, 2, 3, 4} 
    while i != n: 
     while start.weekday() not in wk_days: 
      start -= timedelta(days=1) 
     yield start 
     i += 1 
     start -= timedelta(days=1) 



for dte in (only_weekdays_range(start, 2)): 
    print("Data for {}".format(start.strftime("%b %d %Y"))) 
    url = start_url.format(start.strftime("%Y%m%d")) 
    print(url) 
    r = requests.get(url) #downloads website html 
    soup = BeautifulSoup(r.content) #soup calls the data 
    v_data = soup.select('.text') 
    for symbol in v_data: 
     print(symbol.text.rstrip()) 
    print(" ") 

The only_weekdays_range получит n дней с даты начала нашей исключая выходные. Вы можете сделать это: print(list(only_weekdays_range(datetime(2015, 7, 26), 2))). Мы получаем [datetime.datetime(2015, 7, 24, 0, 0), datetime.datetime(2015, 7, 23, 0, 0)], что в пятницу 24th и четверг 23rd, потому что наш день старт воскресенье 26th

Если вы хотите, чтобы также исключить праздники, то это совсем еще немного работы. Другим подходом было бы только уменьшение n, когда вы получите данные, возвращаемые с v_data, но это может привести к бесконечным циклам по разным причинам.

+0

Большое спасибо. Это был очень полезный ответ. –

+0

Мои возвращения идентичны «началу» и дублируются количеством входных данных в цикле «для». Вместо ретро-захвата 2 дня я получаю 2 копии стартовых данных ... Я что-то упустил? –

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