#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()