Я создаю веб-сканер, используя scrapy, мой код паука для обнаружения и получения видео URL:
all_links = []
class Onlinecrawl(RobotCrowler):
name = "start"
start_urls = ['https://www.w3schools.com/html/html5_video.asp',]
#rules to extract the data, if you want more depth go on website and read article about it : https://doc.scrapy.org/en/0.24/topics/link-extractors.html
rules = (
Rule(LinkExtractor(
allow=(['https://www.w3schools.com/html/html5_video.asp']),
deny=(['/designers', '/edit', '/new-in', '.*\.html']),
restrict_css=['a'],
),
callback='process_page',
follow=True,
),
)
def parse_page(self, response, starting_url):
video_details = response.css('video').xpath('@src').extract()
for video in video_details:
try:
all_links.append({"videos": video})
print (video)
except (IndexError, TypeError, ValueError) as e:
self.logger.error(f'Could not add product {product}')
self.logger.error(str(e))
# self.increment_dropped_products(starting_url, 1)
continue
Я не получаю простое видео с id=video1
и src mov_bbb.mp4
. Моя цель - получить все ссылки внутри src
, если тег video
существует, может быть на том же уровне или в детстве, и не уверен, где мой код завершится ошибкой. Кроме того, это мой первый паук, поэтому не стесняйтесь критиковать код, также учтите, что веб-сайт не единственный, который я хочу удалить. Я использую его для тестирования, но мой код должен получить все srcs, когда существует видео-тег. это не полный код __init_subclass__
, process_page
и get_rules
функции тоже существуют, но общего кода должно быть достаточно.
Я пошел в оболочку и набрал:
scrapy shell 'https://www.w3schools.com/html/html5_video.asp'
, то:
response.xpath("//@src").extract()
ответ:
response.xpath ( "// @ ЦСИ"). Извлечение ()
['//static.h-bid.com/w3schools.com/20180525/snhb-w3schools.min.js', '//static.h-bid.com/gdpr/cmp.stub.js', 'mov_bbb.mp4', 'mov_bbb.ogg', 'mov_bbb.mp4', 'mov_bbb.ogg', '/images/colorpicker.gif', '/images/w3schoolscom_gray.gif', '/lib/snigel_w3schools_footer.js', 'https://translate.google.com/translate_a/element.js?cb=googleTranslateElementInit']
мой разыскиваемый src есть, но дает ли этот код мне каждый src? и я хочу использовать этот метод?
Пример, когда даже последний тест оболочки не пройден:
scrapy shell 'http://www.aljazeera.net/portal'
это другой сайт
>>> response.xpath("//@src").extract()
['https://www.google.com/recaptcha/api.js?hl=ar', '//players.brightcove.net/665001584001/BJeiBqmye_default/index.min.js', '/Content/js/newPortalScripts?v=Z-iLKM9YBRO-l1eYY_yx1kcRYdw0lCXmuKIN39AaJC41', 'http://www.geoplugin.net/javascript.gp', 'https://d5nxst8fruw4z.cloudfront.net/atrk.gif?account=R69Tk1ao6C525T', '//www.googleadservices.com/pagead/conversion.js', '//www.googleadservices.com/pagead/conversion/947178488/?label=O6blCOKKl18Q-JfTwwM&guid=ON&script=0', '//nexus.ensighten.com/aljazeera/arabic/Bootstrap.js', '/Content/images/headerlogo.png', '/File/GetImageCustom/dccdaf9d-a073-4d31-a7b5-b39b468c07cd/530/300', '/Views/Shared/shared/images/jazeraLogo 2560 ×1440.png', '/Views/Shared/shared/images/jazeraLogo 2560 ×1440.png', '/Views/Shared/shared/images/jazeraLogo 2560 ×1440.png', '/Views/Shared/shared/images/jazeraLogo 2560 ×1440.png', '/Views/Shared/shared/images/jazeraLogo 2560 ×1440.png', '/Views/Shared/shared/images/jazeraLogo 2560 ×1440.png', '/Views/Shared/shared/images/jazeraLogo 2560 ×1440.png', '/Views/Shared/shared/images/jazeraLogo 2560 ×1440.png', '/Views/Shared/shared/images/jazeraLogo 2560 ×1440.png', 'http://blogs.aljazeera.net//File/GetImageCustom/3f749887-1b94-4bdd-b95c-0b739fd4018f/49/49', 'http://blogs.aljazeera.net//File/GetImageCustom/c0257ffc-bed0-4e95-8abe-e3ca0e55fb61/49/49', 'http://blogs.aljazeera.net//File/GetImageCustom/4eee30f8-6bc2-48d5-b615-970be9ba9149/49/49', 'http://blogs.aljazeera.net//File/GetImageCustom/b14f920f-d249-449b-9c7a-450a860a29bf/49/49', 'http://blogs.aljazeera.net//File/GetImageCustom/eb56d7cc-20f1-4e79-be4e-51af09f4cee0/49/49', 'http://blogs.aljazeera.net//File/GetImageCustom/de0bef7f-4a65-486f-9c3e-802d4617e565/49/49', 'http://blogs.aljazeera.net//File/GetImageCustom/43416467-e38c-4967-ba77-88868c13278d/49/49', '/File/GetImageCustom/00000000-0000-0000-0000-000000000000', '/File/GetImageCustom/f4b80a64-7477-48ce-b280-56fd6ddc76d1/272/158', '/File/GetImageCustom/dccdaf9d-a073-4d31-a7b5-b39b468c07cd/272/158', '/File/GetImageCustom/1b20fec7-ff09-46d9-bd4c-3c3e17bdb640/272/158', '/File/GetImageCustom/52ee7757-ab01-46f1-b192-ea572e0d5ef8/272/158', '/File/GetImageCustom/f254f4e0-f6b2-41c2-9c57-9581dfa57264/272/158', '/File/GetImageCustom/89fe9d07-626b-4479-a195-0c721a240da1/272/158', '/File/GetImageCustom/5196299b-257d-40e0-b76f-b9979427eb6f/272/158', '/File/GetImageCustom/04531520-7ae1-4dec-92fb-6613996bee52/272/158', '/File/GetImageCustom/290f4cb3-8e81-45c2-893f-30208ec476bf/272/158', '/File/GetImageCustom/9bee5bfe-635c-4884-934f-c2d481ecba10/272/158', '/File/GetImageCustom/01c8a89a-2379-4e24-b7b0-a195925324da/272/158', '/File/GetImageCustom/783d5e7b-c34e-4f09-a0fc-1cc903f2af32/272/158', '//platform.twitter.com/widgets.js', '/Content/images/footerlogo.png', '/Content/images/iHorizons-icon.png', '//radar.cedexis.com/1/15249/radar.js']
та же команда оболочки, и ей не удалось получить src в этом блоке:
<video id="main-video-9489741_html5_api" data-video-id="5834567349001" data-account="665001584001" data-player="BJeiBqmye" data-embed="default" class="vjs-tech" tabindex="-1" src="blob:http://www.aljazeera.net/9765540b-1e35-4e8c-a304-9e2f9492a07e"></video>
в идеале должен возвращать blob: http://www.aljazeera.net/9765540b-1e35-4e8c-a304-9e2f9492a07e
Edit:
Еще один пример неудачного случая после того, как в комментарии упоминается, что проблему было трудно воспроизвести:
пожалуйста, проверьте эту ссылку http://www.aljazeera.net/programs/scenarios/2018/9/13/%D8%A7%D9%84%D8%B5%D9%8A%D9%86-%D9%88%D8%A3%D9%81%D8%B1%D9%8A%D9%82%D9%8A%D8%A7-%D8%B4%D8%B1%D8%A7%D9%83%D8%A9-%D9%85%D8%AA%D8%B9%D8%AB%D8%B1%D8%A9-%D8%A3%D9%85-%D9%85%D8%AA%D8%B7%D9%88%D8%B1%D8%A9
и просмотр видео в нем
Вы увидите 2 отличных примера подобных проблем:
<video id="vid-c8d54140-70fe-4561-9780-8a4e7763c58a_html5_api" data-video-id="5834567349001" data-account="665001584001" data-player="BJeiBqmye" data-embed="default" class="vjs-tech" tabindex="-1" poster="http://bc04.ajmn.me/665001584001/201809/2309/665001584001_5834579342001_5834567349001-vs.jpg?pubId=665001584001" src="blob:http://www.aljazeera.net/a071437f-421f-40ac-9dc7-43afb98d96a0"></video>
снова из этого раздела, я хотел бы blob: http://www.aljazeera.net/a071437f-421f-40ac-9dc7-43afb98d96a0
Второй пример прямо под этим блоком:
<div class="vjs-poster" tabindex="-1" aria-disabled="false" style="background-image: url("http://bc04.ajmn.me/665001584001/201809/2309/665001584001_5834579342001_5834567349001-vs.jpg?pubId=66500158;4001");"></div>
Я бы тоже хотел http://bc04.ajmn.me/665001584001/201809/2309/665001584001_5834579342001_5834567349001-vs.jpg?pubId=66500158;4001 отсюда.