Мы можем объединить две коллекции, используя sub-запрос mongoDB. Вот пример, Комментарии -
`db.commentss.insert([
{ uid:12345, pid:444, comment:"blah" },
{ uid:12345, pid:888, comment:"asdf" },
{ uid:99999, pid:444, comment:"qwer" }])`
Пользователи -
db.userss.insert([
{ uid:12345, name:"john" },
{ uid:99999, name:"mia" }])
Суб-запрос MongoDB для JOIN -
`db.commentss.find().forEach(
function (newComments) {
newComments.userss = db.userss.find( { "uid": newComments.uid } ).toArray();
db.newCommentUsers.insert(newComments);
}
);`
Получить результат из недавно созданная коллекция -
db.newCommentUsers.find().pretty()
Результат -
`{
"_id" : ObjectId("5511236e29709afa03f226ef"),
"uid" : 12345,
"pid" : 444,
"comment" : "blah",
"userss" : [
{
"_id" : ObjectId("5511238129709afa03f226f2"),
"uid" : 12345,
"name" : "john"
}
]
}
{
"_id" : ObjectId("5511236e29709afa03f226f0"),
"uid" : 12345,
"pid" : 888,
"comment" : "asdf",
"userss" : [
{
"_id" : ObjectId("5511238129709afa03f226f2"),
"uid" : 12345,
"name" : "john"
}
]
}
{
"_id" : ObjectId("5511236e29709afa03f226f1"),
"uid" : 99999,
"pid" : 444,
"comment" : "qwer",
"userss" : [
{
"_id" : ObjectId("5511238129709afa03f226f3"),
"uid" : 99999,
"name" : "mia"
}
]
}`
Надеюсь, что это поможет.
Я нашел одно решение. Вы должны использовать селен webdriver
в режиме headless
, получить page_source
от драйвера и дать немного time.sleep()
. Я проверил данные, которые он показывает, как и ожидалось.
Однако я не знаю ваш список URL, поэтому вы можете создать свой список и попробовать его. Дайте мне знать, если вам нужна дополнительная помощь.
from selenium import webdriver
from bs4 import BeautifulSoup
import time
teamlinks=['http://www.premierleague.com//clubs/1/Arsenal/squad?se=79','http://www.premierleague.com//clubs/1/Arsenal/squad?se=54']
playerLink1 = []
playerLink2 = []
for i in range(len(teamlinks)):
chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument('--headless')
chrome_options.add_argument('window-size=1920x1080');
driver = webdriver.Chrome(options=chrome_options)
driver.get(teamlinks[i])
time.sleep(10)
squadPage=driver.page_source
soup = BeautifulSoup(squadPage, 'html.parser')
playerLocation = soup.findAll('a', class_=re.compile("playerOverviewCard"))
for i in range(len(playerLocation)):
#Save the link, complete with domain.
playerLink1.append("http://www.premierleague.com/" +
playerLocation[i]['href'] + '?se=79')
#For the second link, change the page from player overview to stats
playerLink2.append(playerLink1[i].replace("overview", "stats"))
driver.quit()
print(playerLink2)
Страница, которую вы пытаетесь удалить, использует Javascript для загрузки нужного вам списка игроков.
Вариант 1: Вы можете использовать этот новый модуль под названием запросы-html (никогда не пробовал себя), который утверждает, что поддерживает Javascript.
Вариант 2: Используя devtools из Chrome, я мог найти фактический XHR-запрос, сделанный страницей, чтобы получить список игроков. Этот код может получить требуемый вывод с помощью модуля запросов.
import json
playerLink1 = []
playerLink2 = []
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.75 Safari/537.36',
'Origin': 'https://www.premierleague.com',
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
'Referer': 'https://www.premierleague.com//clubs/1/Arsenal/squad?se=79'}
res = requests.get('https://footballapi.pulselive.com/football/teams/1/compseasons/79/staff?altIds=true&compCodeForActivePlayer=EN_PR', headers=headers)
player_data = json.loads(res.content.decode('utf-8'))
for player in player_data['players']:
href = 'https://www.premierleague.com/players/{}/{}/'.format(player['id'], player['name']['display'].replace(' ', '-'))
playerLink1.append("http://www.premierleague.com/" + href + "overview" + '?se=79')
playerLink2.append(href + "stats")