При необходимости извлечения данных с нескольких страниц вы обычно можете выполнить 1 из следующих действий:
1) Определить шаблон URL, который используется при переходе от страницы к странице,и перебрать те.К сожалению, это не вариант, так как URL не меняется от страницы к странице.
2) Если страница является динамической и должна отображаться в первую очередь перед извлечением данных из исходного html или просто для имитации использования openig браузера и нажатия на элементы (например,в этом случае нажмите ►
, используйте Selenium для симуляции открытия страницы, затем извлеките данные со страницы 1, затем симулируйте щелчок на следующей странице, извлеките данные со страницы 2 и добавьте данные со страницы 2 к тому, что вы сохранили.со страницы 1 и т. д. и т. д. и т. п. до тех пор, пока вы не дойдете до конца страниц. Недостатком этого является то, что переход на страницу, страницу, страницу занимает много времени, особенно для 103 страниц.
3) Найдите URL-адрес запроса GET ot POST для доступа к API и получения данных в формате json в соответствии с предложением QHarr.Вероятно, это лучший способ сделать это, но я не смог найти тот URL-адрес запроса, который он / она упомянул, и я смог найти другой путь.
4) jsonданные иногда находятся внутри исходного кода HTML.Найдите это, выполнив поиск по тегам <script>
, затем манипулируйте строкой, чтобы извлечь структуру json, и используйте json.loads()
, чтобы прочитать это. Самым сложным было найти, где у них есть все данные, которые вы хотите, но янашел его под ключами: ['wixapps']['appbuilder']['items']['BlankList_i34svvgq322']
.Затем вы можете перебирать эти элементы, чтобы получить то, что вы хотите:
Мое решение ниже - вариант 4:
from bs4 import BeautifulSoup
import requests
import json
headers={"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:65.0) Gecko/20100101 Firefox/65.0", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8", "Accept-Language": "en-US,en;q=0.5", "Accept-Encoding": "gzip, deflate", "DNT": "1", "Connection": "close", "Upgrade-Insecure-Requests": "1"}
r = requests.get('https://www.acoinsite.org/life-member',headers=headers)
soup = BeautifulSoup(r.content,'html.parser')
scripts = soup.find_all('script')
for script in scripts:
if 'var warmupData = ' in script.text:
script_str = script.text
script_str = script_str.split('var warmupData = ')[1]
jsonStr = script_str.rsplit(';',1)[0]
jsonObj = json.loads(jsonStr)
for k, v in jsonObj['wixapps']['appbuilder']['items']['BlankList_i34svvgq322'].items():
print (v['title'])
Вывод
Вы можетеРаспечатайте имена самостоятельно, но быстро, я также просто поместил их в список и показал, что у вас есть 1030 имен:
name_list = [ v['title'] for k, v in jsonObj['wixapps']['appbuilder']['items']['BlankList_i34svvgq322'].items() ]
print (len(name_list))
1030