Вы можете использовать дату начала, а затем - = в день, используя 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
, но это может привести к бесконечным циклам по разным причинам.
Я предполагаю, что BeautifulSoup не поддерживает JavaScript по умолчанию, но мне интересно, требует ли ваш целевой сайт. Вы пробовали просматривать целевой сайт с отключенным JS? – halfer
Нет, нет. Я не должен был беспокоиться о JS, хотя, если бы мог найти способ посмотреть URL-адрес, потому что все, что мне нужно изменить, это 4 числа в предыдущих URL-адресах, соответствующих месяцу и дню (например,0801 за август 1) –
Ах, ваш ответ смутил меня сейчас - похоже, вы не думаете, что JavaScript имеет значение для веб-соскабливания (это очень важно). Я думаю, вы имеете в виду, что скребок отлично работает для одной страницы, и вы просто хотите генерировать новые URL-адреса. Это правильно? – halfer