Код работает в течение 20 минут +, затем останавливается без вывода, в чем проблема? - PullRequest
1 голос
/ 03 апреля 2020

Я пытаюсь получить 'sr c' из 500 изображений профиля на Transfermarkt , изображения на каждом профиле игрока, а не маленькое изображение из списка. Мне удалось сохранить URL каждого игрока в список. Теперь, когда я пытаюсь выполнить итерацию, код просто запускается и запускается, затем что-то останавливается через 20 минут, без каких-либо ошибок или вывода из моей команды печати. Как я уже сказал, я хочу источник (sr c) для каждого игрока изображения в их соответствующем профиле.

Я не совсем уверен, что не так с кодом, так как я не получаю никаких сообщений об ошибках. Я создал его с помощью различных постов здесь на stackoverflow.

from bs4 import BeautifulSoup
import requests
import pandas as pd


playerID = []
playerImgSrc = []


result = []

for page in range(1, 21):

    r = requests.get("https://www.transfermarkt.com/spieler-statistik/wertvollstespieler/marktwertetop?land_id=0&ausrichtung=alle&spielerposition_id=alle&altersklasse=alle&jahrgang=0&kontinent_id=0&plus=1",
        params= {"page": page},
        headers= {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:74.0) Gecko/20100101 Firefox/74.0"}
    )
    soup = BeautifulSoup(r.content, "html.parser")

    links = soup.select('a.spielprofil_tooltip')

    for i in range(len(links)):
        playerID.append(links[i].get('id'))

    playerProfile = ["https://www.transfermarkt.com/josh-maja/profil/spieler/" + x for x in playerID]

    for p in playerProfile:
        html = requests.get(p).text
        soup = BeautifulSoup(html, "html.parser")

        link = soup.select('div.dataBild')

    for i in range(len(link)):
        playerImgSrc.append(link[i].get('src'))
print(playerImgSrc)

1 Ответ

3 голосов
/ 03 апреля 2020

По сути, на веб-сайте navigation используется технология AJAX, которая достаточно быстра, как и при просмотре папки на локальном компьютере.

Поэтому data, отображаемый в UI (пользовательский интерфейс), на самом деле исходит из фона XHR запроса на указание c directory внутри хоста, который marktwertetop, где он использует AJAX .

Я смог найти XHR запрос, который был сделан к нему, затем я вызвал его напрямую с требуемым parameters, пока зацикливался на pages.

I Выяснилось, что разница между small и large фотографиями на самом деле одна location из direction, что составляет small и header, поэтому я заменил ее внутри самого url.

Также я считал, что под antibiotic защитой (meant) подразумевается requests.Session() для поддержания Session во время моих loop и downloading pics, что означает предотвращение безопасности слоя TCP с blocking/refusing/dropping мой packet/request а Scraping/Downloading.

Представь, что ты уже откройте browser, где вы переходите между одними и теми же website страницами, есть созданное cookies session, которое established, пока вы подключены к site, и если idle, то это refre sh сама.

Но то, как вы это делали, это просто вы открываете браузер, затем закрываете его, затем снова открываете и закрываете, И ТАК ВКЛЮЧЕНО ! где сторона server считает это атакой DDOS ?! или поведение наводнения. и это очень основы firewall действия.

import requests
from bs4 import BeautifulSoup

site = "https://www.transfermarkt.com/spieler-statistik/wertvollstespieler/marktwertetop?ajax=yw1&page={}"

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:74.0) Gecko/20100101 Firefox/74.0'
}


def main(url):
    with requests.Session() as req:
        allin = []
        for item in range(1, 21):
            print(f"Collecting Links From Page# {item}")
            r = req.get(url.format(item), headers=headers)
            soup = BeautifulSoup(r.content, 'html.parser')
            img = [item.get("src") for item in soup.findAll(
                "img", class_="bilderrahmen-fixed")]
            convert = [item.replace("small", "header") for item in img]
            allin.extend(convert)
    return allin


def download():
    urls = main(site)
    with requests.Session() as req:
        for url in urls:
            r = req.get(url, headers=headers)
            name = url[52:]
            name = name.split('?')[0]
            print(f"Saving {name}")
            with open(f"{name}", 'wb') as f:
                f.write(r.content)


download()

enter image description here

ОБНОВЛЕНИЕ за комментарий пользователя:

import requests
from bs4 import BeautifulSoup
import csv

site = "https://www.transfermarkt.com/spieler-statistik/wertvollstespieler/marktwertetop?ajax=yw1&page={}"

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:74.0) Gecko/20100101 Firefox/74.0'
}


def main(url):
    with requests.Session() as req:
        allin = []
        names = []
        for item in range(1, 21):
            print(f"Collecting Links From Page# {item}")
            r = req.get(url.format(item), headers=headers)
            soup = BeautifulSoup(r.content, 'html.parser')
            img = [item.get("src") for item in soup.findAll(
                "img", class_="bilderrahmen-fixed")]
            convert = [item.replace("small", "header") for item in img]
            name = [name.text for name in soup.findAll(
                "a", class_="spielprofil_tooltip")][:-5]
            allin.extend(convert)
            names.extend(name)
    with open("data.csv", 'w', newline="", encoding="UTF-8") as f:
        writer = csv.writer(f)
        writer.writerow(["Name", "IMG"])
        data = zip(names, allin)
        writer.writerows(data)


main(site)

Вывод: просмотр онлайн

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...