2017-02-13 2 views
2

저는 xHamster를 긁어내는 스크립트를 작성하여 Python을 배우고 있습니다. 누구든지 사이트에 익숙하다면 특정 사용자의 동영상에 대한 모든 URL을 .txt 파일로 구체적으로 작성하려고합니다.Selenium Python (NSFW)을 사용하여 웹 페이지에서 URL 긁기

현재 특정 페이지에서 URL을 긁어 냈지만 여러 페이지가 있으며 페이지 수를 반복하는 데 어려움을 겪고 있습니다.

아래의 제 시도에서 나는 다음 페이지의 URL을 읽으려고 어디에서 코멘트했는지는 현재 None입니다. 어떤 아이디어가 왜, 어떻게 해결할 수 있습니까?

현재 스크립트

#!/usr/bin/env python 

from selenium import webdriver 
from selenium.webdriver.common.keys import Keys 

chrome_options = webdriver.ChromeOptions() 
chrome_options.add_argument("--incognito") 

driver = webdriver.Chrome(chrome_options=chrome_options) 

username = **ANY_USERNAME** 
##page = 1 
url = "https://xhams***.com/user/video/" + username + "/new-1.html" 

driver.implicitly_wait(10) 
driver.get(url) 

links = []; 
links = driver.find_elements_by_class_name('hRotator') 
#nextPage = driver.find_elements_by_class_name('last') 

noOfLinks = len(links) 
count = 0 

file = open('x--' + username + '.txt','w') 
while count < noOfLinks: 
    #print links[count].get_attribute('href') 
    file.write(links[count].get_attribute('href') + '\n'); 
    count += 1 

file.close() 
driver.close() 

페이지를 통해 반복에서 내 시도 :

#!/usr/bin/env python 

from selenium import webdriver 
from selenium.webdriver.common.keys import Keys 

chrome_options = webdriver.ChromeOptions() 
chrome_options.add_argument("--incognito") 

driver = webdriver.Chrome(chrome_options=chrome_options) 

username = **ANY_USERNAME** 
##page = 1 
url = "https://xhams***.com/user/video/" + username + "/new-1.html" 

driver.implicitly_wait(10) 
driver.get(url) 

links = []; 
links = driver.find_elements_by_class_name('hRotator') 
#nextPage = driver.find_elements_by_class_name('colR') 

## TRYING TO READ THE NEXT PAGE HERE 
print driver.find_element_by_class_name('last').get_attribute('href') 

noOfLinks = len(links) 
count = 0 

file = open('x--' + username + '.txt','w') 
while count < noOfLinks: 
    #print links[count].get_attribute('href') 
    file.write(links[count].get_attribute('href') + '\n'); 
    count += 1 

file.close() 
driver.close() 

UPDATE :

나는 아래 필립 Oger 보낸의 답변을 사용하지만 수정 한 두 가지 방법 단일 페이지 검색 결과를 얻으려면 아래에서 :

def find_max_pagination(self): 
    start_url = 'https://www.xhamster.com/user/video/{}/new-1.html'.format(self.user) 
    r = requests.get(start_url) 
    tree = html.fromstring(r.content) 
    abc = tree.xpath('//div[@class="pager"]/table/tr/td/div/a') 
    if tree.xpath('//div[@class="pager"]/table/tr/td/div/a'): 
     self.max_page = max(
      [int(x.text) for x in tree.xpath('//div[@class="pager"]/table/tr/td/div/a') if x.text not in [None, '...']] 
     ) 
    else: 
     self.max_page = 1 

    return self.max_page 

def generate_listing_urls(self): 
    if self.max_page == 1: 
     pages = [self.paginated_listing_page(str(page)) for page in range(0, 1)] 
    else: 
     pages = [self.paginated_listing_page(str(page)) for page in range(0, self.max_page)] 

    return pages 
+0

_______하지만 왜? –

+1

가져 오기를해도 BeautifulSoup을 사용하는 것처럼 보이지 않습니다. – xbonez

+0

@xbonez 아, 예, Selenium으로 전환하기 전에 BeautifulSoup을 처음 사용했습니다. 편집 됨. – kong88

답변

1

사용자 페이지에서 실제로 페이지 매기기가 얼마나 멀리 있는지 알 수 있으므로 페이지 매김을 반복하는 대신 목록 작성을 통해 사용자의 각 URL을 생성 한 다음 하나씩 긁어 낼 수 있습니다.

여기 LXML을 사용하는 두 가지 센트가 있습니다. 이 코드를 복사하거나 붙여 넣으면 TXT 파일의 모든 동영상 URL이 반환됩니다. 사용자 이름 만 변경하면됩니다.

from lxml import html 
import requests 


class XXXVideosScraper(object): 

    def __init__(self, user): 
     self.user = user 
     self.max_page = None 
     self.video_urls = list() 

    def run(self): 
     self.find_max_pagination() 
     pages_to_crawl = self.generate_listing_urls() 
     for page in pages_to_crawl: 
      self.capture_video_urls(page) 
     with open('results.txt', 'w') as f: 
      for video in self.video_urls: 
       f.write(video) 
       f.write('\n') 

    def find_max_pagination(self): 
     start_url = 'https://www.xhamster.com/user/video/{}/new-1.html'.format(self.user) 
     r = requests.get(start_url) 
     tree = html.fromstring(r.content) 

     try: 
      self.max_page = max(
      [int(x.text) for x in tree.xpath('//div[@class="pager"]/table/tr/td/div/a') if x.text not in [None, '...']] 
     ) 
     except ValueError: 
      self.max_page = 1 
     return self.max_page 

    def generate_listing_urls(self): 
     pages = [self.paginated_listing_page(page) for page in range(1, self.max_page + 1)] 
     return pages 

    def paginated_listing_page(self, pagination): 
     return 'https://www.xhamster.com/user/video/{}/new-{}.html'.format(self.user, str(pagination)) 

    def capture_video_urls(self, url): 
     r = requests.get(url) 
     tree = html.fromstring(r.content) 
     video_links = tree.xpath('//a[@class="hRotator"]/@href') 
     self.video_urls += video_links 


if __name__ == '__main__': 
    sample_user = 'wearehairy' 
    scraper = XXXVideosScraper(sample_user) 
    scraper.run() 

사용자가 총 1 페이지 밖에없는 경우를 확인하지 않았습니다. 이게 정상적으로 작동하는지 알려주세요.

+0

예를 들어 주셔서 감사합니다. 사용자 (예 : unmasker777)에 대해 총 1 페이지에 대해 ... find_max_pagination에있는 27 번째 줄 [int (x.text) in x for tree.xpath ('// div [@ class = "pager" [없음, '...']에 x.text가없는 경우 ValueError : max() arg가 빈 시퀀스입니다. – kong88

+0

우리는 Try/외. 코드를 수정하겠습니다. –