Ошибка Beautiful Soup [Нарушение] Избегайте использования document.write()

#python #web-scraping #beautifulsoup

#python #очистка веб-страниц #beautifulsoup

Вопрос:

Я пытаюсь загрузить все изображения с классами top_s и top_sl , он работал несколько страниц, но затем остановился, ошибка HTTP: код состояния 404, net::ERR_UNKNOWN_URL_SCHEME , [Нарушение] Избегайте использования document.write() .

Это мой код на python —

 import requests
import urllib.request
import random
from bs4 import BeautifulSoup as bs


url = 'https://goodlogo.com/top.250/n/250/interval/6'

sourcecode = requests.get(url, headers={'User-Agent': 'Mozilla/5.0'})
plain_text = sourcecode.text
soup = bs(plain_text, 'html.parser')


path = 'C:/Users/roysu/Desktop/src_code/Python_projects/python/web_scrap/myPath/'


link = soup.select(".top_s3l")
for tag in link:
    my_images = tag.get('src')
    path_new = my_images.replace("/images/logos/small/", "")
    file_name = path path_new

    full_name = 'https://goodlogo.com' my_images
    sourcecode1 = requests.get(
        full_name, headers={'User-Agent': 'Mozilla/5.0'})
    file = open(file_name, "wb")
    file.write(sourcecode1.content)
    file.close()


link1 = soup.select(".top_s3")
for tag1 in link1:
    my_images1 = tag1.get('src')

    path_new1 = my_images1.replace("/images/logos/small/", "")
    file_name1 = path path_new1

    full_name1 = 'https://goodlogo.com' my_images1
    enter code here
    sourcecode1 = requests.get(
        full_name1, headers={'User-Agent': 'Mozilla/5.0'})
    file = open(file_name1, "wb")
    file.write(sourcecode1.content)
    file.close()
  

Комментарии:

1. Выдает ли это ошибку для u? В моей системе все прошло отлично.

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

Ответ №1:

Вероятно, это не то, что вы ищете в первую очередь, но я написал это для развлечения, потому что почему бы и нет. Сейчас 2020 год, пандемия повсюду, и мне больше нечем заняться в пятницу вечером.

По сути, это немного улучшенная версия вашего scraper, написанная исключительно в образовательных целях, конечно. Он извлекает все 150 логотипы на страницу (кроме последнего, так как их около 50) довольно медленно, делая паузу не менее чем на секунду, прежде чем захватить другое изображение логотипа.

Вы можете управлять скребком с get_next_page(first_page=2, last_page=3) помощью . Это, например, загрузит все логотипы как со страницы 2 , так и 3 . Если вы, однако, хотите захватить их все, просто удалите аргументы, например, так get_next_page() , и дайте ему запуститься.

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

Не стесняйтесь читать об этом или просто прыгайте с головой в код и изучайте / наслаждайтесь.

В любом случае, вот код. Обратная связь более чем приветствуется!

 import functools
import os
import random
import time

import requests
from bs4 import BeautifulSoup

STARTING_URL = "https://goodlogo.com/top.250/n/250/interval/"
TAG_CLASS = 'top_s3'
DOWNLOAD_DIR = "logos"
HEADERS = {
    "accept": "text/html,application/xhtml xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9",
    "accept-encoding": "gzip, deflate, br",
    "accept-language": "en-US,en;q=0.9,pl;q=0.8",
    "sec-fetch-dest": "document",
    "sec-fetch-mode": "navigate",
    "sec-fetch-site": "same-origin",
    "sec-fetch-user": "?1",
    "upgrade-insecure-requests": "1",
    "user-agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.75 Safari/537.36",
}


def timer(func):
    @functools.wraps(func)
    def wrapper_timer(*args, **kwargs):
        start_time = time.perf_counter()
        value = func(*args, **kwargs)
        end_time = time.perf_counter()
        run_time = end_time - start_time
        print(f"Finished {func.__name__!r} in {run_time:.2f} secs.")
        return value
    return wrapper_timer


def make_logo_dir():
    os.makedirs(DOWNLOAD_DIR, exist_ok=True)


def get_next_page(first_page: int = 1, last_page: int = 8) -> str:
    page_offset = 1
    yield from (
        f"{STARTING_URL}{page_number}" for page_number
        in range(first_page, last_page   page_offset)
    )


def update_headers(current_page: str):
    HEADERS["referer"] = current_page


def get_page_source_code(page_url: str) -> str:
    return requests.get(page_url, headers=update_headers(page_url)).text


def make_soup(page_string: str) -> BeautifulSoup:
    return BeautifulSoup(page_string, "html.parser")


def get_img_src(soup):
    yield from (
        i['src'] for i in soup.find_all("img", {"class", TAG_CLASS})
    )


def parse_source(img_src: str) -> tuple:
    image_name = img_src.split('/')[-1]
    source_url = f"https://goodlogo.com/images/logos/{image_name}"
    return image_name, source_url


def download_logo(image_source: iter):
    for item, image in enumerate(image_source, start=1):
        file_name, source_url, = parse_source(image)
        print(f"Fetching logo #{item}: {source_url}")
        save_logo(file_name, source_url)


def save_logo(file_name: str, source_url: str):
    with open(os.path.join(DOWNLOAD_DIR, file_name), "wb") as f:
        f.write(requests.get(source_url, headers=HEADERS).content)
        pause_for_awhile()


def pause_for_awhile(max_seconds: int = 5):
    time.sleep(random.randint(1, max_seconds))


@timer
def download_logos():
    make_logo_dir()
    for page in get_next_page():
        print(f"--- Current page: {page} ---")
        download_logo(get_img_src(make_soup(get_page_source_code(page))))


if __name__ == "__main__":
    download_logos()