2017-01-14 4 views
0

파이썬 지식 : 초보자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

괜찮 :

  • 이 HREF 값을 추출하고 http://aucklandtradesmen.co.nz입니다 기본 URL에 추가를 너무 예제 추출 된 HREF가 경우/가정 -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를 저장해야합니다. 그런 다음 그 목록을 반복하여 페이지에서 원하는 것을 가져옵니다.


목록 서식의 기이함에 대해 사과드립니다. 그것은 한 수준 이상 들여 쓰기를 허용하지 않습니다. 내가 jeffC의 제안 @ 생각 후 해결책을 찾을

+0

덕분에, 이것은 일부 중급 학습자들에게 이상적입니다. 지금 내 공동체에 충실합니다. 드 그리고 그 오류를 찾아내는 것이 도움이됩니다. –

+0

좋은 논리 흐름으로 시작하는 것이 당신이 작성하는 코드보다 더 중요하다고 주장 할 것입니다. 당신은 최고의 코드를 쓸 수 있지만 논리가 꺼져 있다면 스크립트는 여전히 느려질 것입니다. 나는 더 좋은 프로그래머라는 것은 좋은 코딩과 함께 훌륭한 논리 흐름을 배우는 것에 관한 것입니다. – JeffC