Сканируя веб-сайт с порно, я делаю паука, который ползает по страницам в поисках новейших видео, очищая метаданные для каждого из 32 видео на странице.
Далее мой код для паука:
class NaughtySpider(scrapy.Spider):
name = "naughtyspider"
allowed_domains = ["pornhub.com"]
max_pages = 3
# Start request
def start_requests(self):
for i in range(1, self.max_pages):
yield scrapy.Request('https://www.pornhub.com/video?o=cm&page=%s' % i, callback=self.parse_video)
# First parsing method
def parse_video(self, response):
self.log('F i n i s h e d s c r a p i n g ' + response.url)
video_links = response.css('ul#videoCategory').css('li.videoBox').css('div.thumbnail-info-wrapper').css('span.title > a').css('::attr(href)') #Correct path, chooses 32 videos from page ignoring the links coming from ads
links_to_follow = video_links.extract()
for url in links_to_follow:
yield response.follow(url = url,
callback = self.parse_metadata)
# Second parsing method
def parse_metadata(self, response):
# Create a SelectorList of the course titles text
video_title = response.css('div.title-container > h1.title > span.inlineFree::text')
# Extract the text and strip it clean
video_title_ext = video_title.extract_first()
# Extract views
video_views = response.css('span.count::text').extract_first()
# Extract tags
video_tags = response.css('div.tagsWrapper a::text').extract()
# Extract Categories
video_categories = response.css('div.categoriesWrapper a::text').extract()
# Fill in the dictionary
yield {
'title': video_title_ext,
'views': video_views,
'tags': video_tags,
'categories': video_categories,
}
Дело в том, что почти половина записей оказывается пустыми, без заголовка, представлений, тегов или категорий. Пример журнала:
[scrapy.core.scraper] DEBUG: Scraped from <200 https://www.pornhub.com/view_video.php?viewkey=ph5d594b093f8d6>
{'title': None, 'views': None, 'tags': [], 'categories': []}
Но в то же время, если я получу ту же самую ссылку в оболочке scrapy и скопирую и вставлю те же самые пути селектора в паук, это даст мне правильные значения:
In [4]: fetch('https://www.pornhub.com/view_video.php?viewkey=ph5d594b093f8d6')
[scrapy.core.engine] DEBUG: Crawled (200) <GET https://www.pornhub.com/view_video.php?viewkey=ph5d594b093f8d6> (referer: None)
In [5]: response.css('div.tagsWrapper a::text').extract()
Out[5]: ['alday', '559', '+ ']
In [6]: response.css('span.count::text').extract_first()
Out[6]: '6'
Заранее благодарю за любую помощь.
Изменить. Правильно ли я полагаю, что это не проблема моего кода, а скорее ограничение на сервере, чтобы избежать соскабливания?
scrapy shell
. - person Gallaecio   schedule 19.08.2019