2017-01-14 14 views
0

Python Knowledge:beginnerリンク内のリンクをクリックしてシミュレートする - Selenium Python

連絡先情報をスクラップするためのスクリプトを作成できました。私が初心者であるため、最初のすべてのリンクを抽出してテキストファイルにコピーして、これをで使用しています。link = browser.find_element_by_link_text(str(link_text))連絡先のスクレイピングが動作していることが確認されています私の別の実行に基づいて)。問題は、最初のリンクをクリックした後、そのリンクをクリックすることができないため、連絡先情報を削ることができないことです。

スクリプトにはどのような問題がありますか?私は初心者ですので、私のスクリプトは少し手作業で長いと思います。 ありがとうございました!!!ところで

from selenium import webdriver 
from selenium.webdriver.common.by import By 
from selenium.webdriver.support.ui import WebDriverWait 
from selenium.webdriver.support import expected_conditions as EC 

from selenium.common.exceptions import NoSuchElementException 

import requests 
from bs4 import BeautifulSoup 
import urllib 
import re 
import sys 
reload(sys) 
sys.setdefaultencoding('utf-8') 
import csv, time, lxml 

######################### open file list #################################### 
testfile = open("category.txt") # this is where I saved the category 
readfile = testfile.read() 
readfilesplit = readfile.split("\n") 
############################### end ################################### 

################### open browser ############################### 
browser = webdriver.Firefox() 
browser.get('http://aucklandtradesmen.co.nz/') 
####################### end ################################### 

link_texts = readfilesplit 
for link_text in link_texts: 

     link = browser.find_element_by_link_text(str(link_text)) 
     WebDriverWait(browser, 10).until(EC.presence_of_element_located((By.CSS_SELECTOR, ".add-listing"))) 

     link.click() #click link 
     time.sleep(5) 

     print "-------------------------------------------------------------------------------------------------" 
     print("Getting listings for '%s'" % link_text) 

################# get list name ####################### 
     urlNoList = 'http://aucklandtradesmen.co.nz/home-mainmenu-1.html' 
     r = requests.get(browser.current_url) 

     if (urlNoList != browser.current_url): 
      soup = BeautifulSoup(r.content, 'html.parser') 

      g_data = soup.find_all("div", {"class":"listing-summary"}) 
      pageRange = soup.find_all("span", {"class":"xlistings"}) 

      pageR = [pageRange[0].text] 
      pageMax = str(pageR)[-4:-2] # get max item for lists 

      X = str(pageMax).replace('nd', '0') 
      # print "Number of listings: ", X 
      Y = int(X) #convert string to int 
      print "Number of listings: ", Y 

      for item in g_data: 
       try: 
        listingNames = item.contents[1].text 
        lstList = [] 
        lstList[len(lstList):] = [listingNames] 

        replStr = re.sub(r"u'", "'",str(lstList)) #strip u' char 

        replStr1 = re.sub(r"\s+'", "'",str(replStr)) #strip space and ' 

        replStr2 = re.sub(r"\sFeatured", "",str(replStr1)) #strip Featured string 
        print "Cleaned string: ", replStr2 

        ################ SCRAPE INFO ################ 
################### This is where the code is not executing ####################### 
        count = 0 
        while (count < Y): 
         for info in replStr2: 
          link2 = browser.find_element_by_link_text(str(info)) 
          time.sleep(10) 
          link2.click() 
          WebDriverWait(browser, 10).until(EC.presence_of_element_located((By.CSS_SELECTOR, "#rating-msg"))) 
          print "count", count 
          count+= 1 
          print("Contact info for: '%s'" % link_text) 

          r2 = requests.get(browser.current_url) 

          soup2 = BeautifulSoup(r2.content, 'html.parser') 

          g_data2 = soup.find_all("div", {"class":"fields"}) 

          for item2 in g_data2: 
          # print item.contents[0] 
           print item2.contents[0].text 
           print item2.contents[1].text 
           print item2.contents[2].text 
           print item2.contents[3].text 
           print item2.contents[4].text 
           print item2.contents[5].text 
           print item2.contents[6].text 
           print item2.contents[7].text 
           print item2.contents[8].text 

        browser.back() 
        WebDriverWait(browser, 10).until(EC.presence_of_element_located((By.CSS_SELECTOR, ".add-listing"))) 
################### END ---- This is where the code is not executing END ---####################### 
        ############ END SCRAPE INFO #################### 
       except NoSuchElementException: 
        browser.back() 
        WebDriverWait(browser, 10).until(EC.presence_of_element_located((By.CLASS_NAME, "pagenav"))) 

     else: 
      browser.back() 
      WebDriverWait(browser, 10).until(EC.presence_of_element_located((By.CLASS_NAME, "pagenav"))) 
      print "Number of listings: 0" 

     browser.back() 
     WebDriverWait(browser, 10).until(EC.presence_of_element_located((By.CLASS_NAME, "pagenav"))) 

これは、結果の一部である:私はどうなるのか

------------------------------------------------------------------------------------------------- 
Getting listings for 'Plumbers' 
Number of listings: 5 
Cleaned string: ['Hydroflame Plumbing & Gas Ltd'] 
Cleaned string: ['Osborne Plumbing Ltd'] 
Cleaned string: ['Plumbers Auckland Central'] 
Cleaned string: ['Griffiths Plumbing'] 
Cleaned string: ['Plumber Auckland'] 
------------------------------------------------------------------------------------------------- 
Getting listings for 'Professional Services' 
Number of listings: 2 
Cleaned string: ['North Shore Chiropractor'] 
Cleaned string: ['Psychotherapy Werks - Rob Hunter'] 
------------------------------------------------------------------------------------------------- 
Getting listings for 'Property Maintenance' 
Number of listings: 7 
Cleaned string: ['Auckland Tree Services'] 
Cleaned string: ['Bob the Tree Man'] 
Cleaned string: ['Flawless House Washing & Drain Unblocking'] 
Cleaned string: ['Yardiez'] 
Cleaned string: ['Build Corp Apartments Albany'] 
Cleaned string: ['Auckland Trellis'] 
Cleaned string: ['Landscape Design'] 

答えて

0

大丈夫私はjeffCの提案@思考の後に解決策を見つけた:

  • 例えば抽出HREFが/家である場合ので、hrefの値を抽出し、http://aucklandtradesmen.co.nzあるベースURLに追加し-mainmenu-1/alarms-a-security/armed-alarms-ltd-.htmlとブラウザにそのURLに移動するよう指示し、現在のページで必要なものを実行できます。
0

がロジックにいくつかの変更です。ここで私が使用することをお勧めするロジックフローがあります。これにより、リンクの書き込みがなくなり、スクリプトが高速化されます。

1. Navigate to http://aucklandtradesmen.co.nz/ 
2. Grab all elements using CSS selector "#index a" and store the attribute "href" of each 
    in an array of string (links to each category page) 
3. Loop through the href array 
    3.1. Navigate to href 
     3.1.1. Grab all elements using CSS selector "div.listing-summary a" and store the 
       .text of each (company names) 
     3.1.2. If an element .by_link_text("Next") exists, click it and return to 3.1.1. 

企業の連絡先情報を会社のページから削除したい場合は、3.1.1にhrefを保存します。そのリストをループして、ページから必要なものを取得します。


リストの書式の奇妙さについては申し訳ありません。それは私に複数のレベルをインデントさせません。

+0

ありがとう、これはいくつかの中間学習者に理想的です..今私の共同に固執するdeとそのエラーを正確に指摘してください。 –

+0

私は良い論理的な流れから始めることは、あなたが書くコードよりも何度も重要だと主張します。あなたは最高のコードを書くことができますが、あなたのロジックがオフであれば、スクリプトはまだ遅くなります。私は良いプログラマーであることは、両方とも学ぶことだと思います。 – JeffC

関連する問題