2017-02-13 9 views
2

私はxHamsterを掻き集めるスクリプトを書くことによってPythonを学んでいます。サイトに詳しい人は、特定のユーザーの動画のすべてのURLを.txtファイルに具体的に書き込もうとしています。Selenium Python(NSFW)を使用してWebページから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の答えを使用しますが変更した二つの方法1ページの結果を得るには以下のようになります:

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を生成し、それらを1つずつ掻き集めることができます。

ここにLXMLを使用した2つのセントがあります。このコードを単にコピー/ペーストすると、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 /を除いて。コードを編集してみましょう。 –

関連する問題