2016-08-06 32 views
0

ich oben Code verwenden Freundesliste von Facebook UID zu kratzen und bin immer einen Fehler:Nameerror: name ‚Fahrer‘ ist nicht definiert

File "C:\Users\Tn\PycharmProjects\untitled\test\1.py", line 15, in friend_uid_list 
    soup = from_uid(uid) 
    File "C:\Users\Tn\PycharmProjects\untitled\test\1.py", line 11, in from_uid 
    driver.get('https://www.facebook.com/' + uid + '/friends') 
NameError: name 'driver' is not defined 
""" 

Können Sie mir zeigen, wie man es beheben? Vielen Dank ! Im Folgenden Code mein Code

import multiprocessing 
from selenium.common.exceptions import TimeoutException 
from bs4 import BeautifulSoup 
from selenium import webdriver 
from selenium.webdriver.common.by import By 

def from_uid(uid): 
    driver.get('https://www.facebook.com/' + uid + '/friends') 
    return BeautifulSoup(driver.page_source, "html5lib") 

def friend_uid_list(uid): 
    soup = from_uid(uid) 
    friends = soup.find_all("div", class_="fsl fwb fcb") 
    target = open('C:/friend_uid_list.txt', 'a') 
    for href in friends: 
     href = href.find('a') 
     try: 
      target.write(href + "\n") 
     except: 
      pass 
    target.close() 

if __name__ == '__main__': 

    driver = webdriver.Firefox() 
    driver.get("https://www.facebook.com/") 
    driver.find_element_by_css_selector("#email").send_keys("[email protected]") 
    driver.find_element_by_css_selector("#pass").send_keys("mypass") 
    driver.find_element_by_css_selector("#u_0_m").click() 

    pool = multiprocessing.Pool(3) 
    pool.map(friend_uid_list, [100004159542140,100004159542140,100004159542140]) 
+0

In welcher Zeile tritt der Fehler auf? – laike9m

+0

@ laike9m, Hallo, Die Zeile auftreten, der Fehler ist 15 und 11 – user3373322

+0

Bitte fügen Sie Ihre ganze Fehlermeldung. Ich möchte sehen, wie Sie Ihr Programm ausführen. – laike9m

Antwort

0

Der Grund ist einfach: Sie einige neue Prozesse erstellen, und es kann nicht die Variablen in einem anderen Prozess (Hauptprozess) sehen.

Es gibt mehrere Lösungen:

  1. die Variablen Pass Sie als Argumente benötigen. Dies ist jedoch nicht möglich, da driver nicht pickbar ist.

  2. Erstellen Sie einen neuen Treiber für jeden Prozess.

  3. Verwenden Sie Multi-Threading anstelle von Multi-Processing. Ich bin mir jedoch nicht sicher, ob Selen so funktioniert, Sie müssen es selbst testen.

+0

Warum Lösung # 1 ist nicht möglich? Kann ich Code in pool.map ändern (friend_uid_list, [(100004159542140, Treiber), (100004159542140, Treiber), (100004159542140, Treiber)])? – user3373322

+0

http://stackoverflow.com/questions/8804830/python-multiprocessing-pickling-error – laike9m