парсинг картинок
from bs4 import BeautifulSoup
import requests
from time import sleep
def getImages(url):
sleep(2)
HEADERS = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.163 Safari/537.36'}
responce = requests.get(url, headers=HEADERS)
soup = BeautifulSoup(responce.content, 'html.parser')
items = soup.findAll('div', class_='reader-view__container')
comps = []
for item in items:
comps.append(item.find('img').get('src'))
print(comps)
getImages('https://hentailib.me/koshkodevochki-eto-lozh/v1/c1?page=1')
мне нужно спарсить все изображения со странички сайта. Но из-за загрузки сайта это не получается. Я пробовал ставить таймер чтоб переждать загрузку, но это не работает. Но при заходе на сайт через браузер загрузка происходит примерно за секунду.
Ответы (3 шт):
def getImages(url):
HEADERS = {
'User-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)
AppleWebKit/537.36 (KHTML, like Gecko) '
'Chrome/85.0.4183.121 Safari/537.36',
'Accept-Language': 'en',
'accept': '*/*',
'origin': 'https://best.aliexpress.ru',
'sec-fetch-site': 'cross-site',
'sec-fetch-mode': 'cors',
'sec-fetch-dest': 'empty',
'referer': 'https://best.aliexpress.ru/',
'accept-language': 'ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7'
}
Далее всё как у вас. Вас сайт просто определяет как парсер, а нужно притвориться браузером с человеком. :)
PS.
У меня не пустой массив
Вот скрин с Юпитера-ноутбука:
Посмотрите на адрес самого изображения:
https://img3.hentailib.me//manga/koshkodevochki-eto-lozh/chapters/468545/09_UfrK.png
_UfrK на конце, это явно защита от такого вот банального скачивания.
Посмотрите на куки, там есть XSRF-TOKEN, пока вы его не получите, картинки вам никто не покажет.
В общем случае: при такой защите делаются 2 запроса, первый, на загрузку страницы и получение этого токена, а второй, для получения нужного контента.
Анализ
Сами данные по картинкам в html не находятся, их нужно искать среди javascript кода. Т.е. при выполнении скриптов, страница будет частично сформирована из js-кода.
Картинки описаны в двух местах:
1.
2.
Вот кусок из 1.:
{
"page": 1,
"media": {
"id": 21928,
"slug": "koshkodevochki-eto-lozh",
"type": 1,
"caution": 2
},
"bookmark": null,
"current": {
"id": 468545,
"volume": 1,
"number": "1",
"index": 1
},
"next": {
"id": 482546,
"volume": 1,
"number": "2",
"url": "https:\/\/hentailib.me\/koshkodevochki-eto-lozh\/v1\/c2"
},
"prev": null,
"img": {
"url": "\/manga\/koshkodevochki-eto-lozh\/chapters\/468545\/",
"server": "compress",
"supportWebp": true
},
"servers": {
"main": "https:\/\/img2.hentailib.me",
"secondary": "https:\/\/img2.hentailib.me",
"compress": "https:\/\/img3.hentailib.me",
"fourth": "https:\/\/img4.hentailib.me"
}
}
А вот из 2.:
[{"p":1,"u":"02_iips.png"},{"p":2,"u":"03_67pz.png"},{"p":3,"u":"04_v5SN.png"},{"p":4,"u":"05_0dsy.png"},{"p":5,"u":"06_guTg.png"},{"p":6,"u":"07_cCtQ.png"},{"p":7,"u":"08_EQUb.png"},{"p":8,"u":"09_UfrK.png"},{"p":9,"u":"10_bffa.png"},{"p":10,"u":"11_7iDq.png"},{"p":11,"u":"12_bwHN.png"},{"p":12,"u":"13_ENhV.png"},{"p":13,"u":"14_wisV.png"},{"p":14,"u":"15_uVKc.png"},{"p":15,"u":"16_DOEE.png"},{"p":16,"u":"17_D3O1.png"},{"p":17,"u":"18_Y8S2.png"},{"p":18,"u":"19_g7SA.png"},{"p":19,"u":"20_B9qA.png"},{"p":20,"u":"21_IhKI.png"},{"p":21,"u":"22_sUOK.png"},{"p":22,"u":"23_PY78.png"}]
Парсинг
Теперь вытащим эти данные из страницы используя регулярку и распарсим в JSON:
import re
import json
import sys
import requests
url = 'https://hentailib.me/koshkodevochki-eto-lozh/v1/c1?page=1'
rs = requests.get(url)
info = re.search('window.__info = (.+?);', rs.text)
pages = re.search('window.__pg = (.+?);', rs.text)
info = json.loads(info.group(1))
pages = json.loads(pages.group(1))
print(info)
# {'page': 1, 'media': {'id': 21928, 'slug': 'koshkodevochki-eto-lozh', 'type': 1, ...
print(pages)
# [{'p': 1, 'u': '02_iips.png'}, {'p': 2, 'u': '03_67pz.png'}, {'p': 3, 'u': ...
Обработка
Нужно из этих двух коллекций сгенерировать URL. Чтобы точно знать как делается, нужно найти javascript, ответственный за это, но мне не охото и я составлю на основе того URL, что увидел, когда открыл страницу сайта:
https://img3.hentailib.me//manga/koshkodevochki-eto-lozh/chapters/468545/02_iips.png
У меня получился такой алгоритм:
info = json.loads(info.group(1))
pages = json.loads(pages.group(1))
url_chapter = info['img']['url']
url_base = info['servers']['main'] + url_chapter
items = [url_base + p['u'] for p in pages]
Всё вместе:
import re
import json
from typing import List
import requests
def get_images(url: str) -> List[str]:
rs = requests.get(url)
info = re.search('window.__info = (.+?);', rs.text)
if not info:
print('[#] Not found window.__info!')
return []
pages = re.search('window.__pg = (.+?);', rs.text)
if not pages:
print('[#] Not found window.__pg!')
return []
info = json.loads(info.group(1))
pages = json.loads(pages.group(1))
url_chapter = info['img']['url']
url_base = info['servers']['main'] + url_chapter
return [url_base + p['u'] for p in pages]
if __name__ == '__main__':
url = 'https://hentailib.me/koshkodevochki-eto-lozh/v1/c1?page=1'
items = get_images(url)
print(f'Images ({len(items)}):')
for i, url in enumerate(items, 1):
print(f' {i}. {url}')
Результат (осторожно по ссылкам переходите - там контент для взрослых):
Images (22):
1. https://img2.hentailib.me/manga/koshkodevochki-eto-lozh/chapters/468545/02_iips.png
2. https://img2.hentailib.me/manga/koshkodevochki-eto-lozh/chapters/468545/03_67pz.png
3. https://img2.hentailib.me/manga/koshkodevochki-eto-lozh/chapters/468545/04_v5SN.png
4. https://img2.hentailib.me/manga/koshkodevochki-eto-lozh/chapters/468545/05_0dsy.png
5. https://img2.hentailib.me/manga/koshkodevochki-eto-lozh/chapters/468545/06_guTg.png
6. https://img2.hentailib.me/manga/koshkodevochki-eto-lozh/chapters/468545/07_cCtQ.png
7. https://img2.hentailib.me/manga/koshkodevochki-eto-lozh/chapters/468545/08_EQUb.png
8. https://img2.hentailib.me/manga/koshkodevochki-eto-lozh/chapters/468545/09_UfrK.png
9. https://img2.hentailib.me/manga/koshkodevochki-eto-lozh/chapters/468545/10_bffa.png
10. https://img2.hentailib.me/manga/koshkodevochki-eto-lozh/chapters/468545/11_7iDq.png
11. https://img2.hentailib.me/manga/koshkodevochki-eto-lozh/chapters/468545/12_bwHN.png
12. https://img2.hentailib.me/manga/koshkodevochki-eto-lozh/chapters/468545/13_ENhV.png
13. https://img2.hentailib.me/manga/koshkodevochki-eto-lozh/chapters/468545/14_wisV.png
14. https://img2.hentailib.me/manga/koshkodevochki-eto-lozh/chapters/468545/15_uVKc.png
15. https://img2.hentailib.me/manga/koshkodevochki-eto-lozh/chapters/468545/16_DOEE.png
16. https://img2.hentailib.me/manga/koshkodevochki-eto-lozh/chapters/468545/17_D3O1.png
17. https://img2.hentailib.me/manga/koshkodevochki-eto-lozh/chapters/468545/18_Y8S2.png
18. https://img2.hentailib.me/manga/koshkodevochki-eto-lozh/chapters/468545/19_g7SA.png
19. https://img2.hentailib.me/manga/koshkodevochki-eto-lozh/chapters/468545/20_B9qA.png
20. https://img2.hentailib.me/manga/koshkodevochki-eto-lozh/chapters/468545/21_IhKI.png
21. https://img2.hentailib.me/manga/koshkodevochki-eto-lozh/chapters/468545/22_sUOK.png
22. https://img2.hentailib.me/manga/koshkodevochki-eto-lozh/chapters/468545/23_PY78.png


