2016-01-11 11 views
8

Ho lavorato su qualche codice Python per poter ottenere collegamenti a account di social media da siti web governativi, per una ricerca semplificata con cui i comuni possono essere contattati. Sono riuscito ad adattare un codice per lavorare in 2.7, che stampa tutti i collegamenti a facebook, twitter, linkedin e google + presenti su un determinato sito Web di input. Il problema che sto attualmente sperimentando è che non cerco link su un'unica pagina web, ma su un elenco di circa 200 siti Web, ho un file Excel. Non ho esperienza con l'importazione di questo tipo di elenchi in Python, quindi mi chiedevo se qualcuno potesse dare un'occhiata al codice e suggerire un modo corretto per impostare tutte queste pagine web come base_url, se possibile;Utilizzo di più pagine Web in un raschiatore web

import cookielib 

import mechanize 

base_url = "http://www.amsterdam.nl" 

br = mechanize.Browser() 
cj = cookielib.LWPCookieJar() 
br.set_cookiejar(cj) 
br.set_handle_robots(False) 
br.set_handle_equiv(False) 
br.set_handle_redirect(True) 
br.set_handle_refresh(mechanize._http.HTTPRefreshProcessor(), max_time=1) 
br.addheaders = [('User-agent', 
       'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.1) Gecko/2008071615 Fedora/3.0.1-1.fc9 Firefox/3.0.1')] 
page = br.open(base_url, timeout=10) 

links = {} 
for link in br.links(): 
    if link.url.find('facebook')>=0 or link.url.find('twitter')>=0 or link.url.find('linkedin')>=0 or link.url.find('plus.google')>=0: 
    links[link.url] = {'count': 1, 'texts': [link.text]} 

# printing 
for link, data in links.iteritems(): 
print "%s - %s - %s - %d" % (base_url, link, ",".join(data['texts']), data['count']) 

risposta

5

Lei ha detto che avete un file excel con l'elenco di tutti i siti giusto? Pertanto è possibile esportare il file excel come file csv che è possibile leggere i valori nel codice Python.

Here's some more information regarding that.

Here's how to work directly with excel files

si può fare qualcosa sulla falsariga:

import csv 

links = [] 

with open('urls.csv', 'r') as csv_file: 
    csv_reader = csv.reader(csv_file) 
    # Simple example where only a single column of URL's is present 
    links = list(csv_reader) 

Ora links è un elenco di tutti gli URL. È quindi possibile scorrere l'elenco all'interno di una funzione che recupera la pagina e scansiona i dati.

def extract_social_links(links): 
    for link in links: 
     base_url = link 

     br = mechanize.Browser() 
     cj = cookielib.LWPCookieJar() 
     br.set_cookiejar(cj) 
     br.set_handle_robots(False) 
     br.set_handle_equiv(False) 
     br.set_handle_redirect(True) 
     br.set_handle_refresh(mechanize._http.HTTPRefreshProcessor(),  max_time=1) 
     br.addheaders = [('User-agent', 
      'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.1) Gecko/2008071615 Fedora/3.0.1-1.fc9 Firefox/3.0.1')] 
     page = br.open(base_url, timeout=10) 

     links = {} 
     for link in br.links(): 
      if link.url.find('facebook')>=0 or link.url.find('twitter')>=0 or  link.url.find('linkedin')>=0 or link.url.find('plus.google')>=0: 
      links[link.url] = {'count': 1, 'texts': [link.text]} 

     # printing 
     for link, data in links.iteritems(): 
     print "%s - %s - %s - %d" % (base_url, link, ",".join(data['texts']), data['count']) 

Per inciso, dovresti probabilmente dividere le tue condizioni per renderle più leggibili.

+0

Ok, ha senso, per aggiungere tutti i collegamenti a un elenco, grazie. Viene fornito un errore che ho riscontrato con il tuo codice; 'Traceback (chiamata più recente scorso): file "C: \ Users \ Stefan \ Documenti \ Progetto di Ricerca GRS 50806 \ preesistente dati \ Test - kopie.py", linea 11, in data.links (lista (csv_reader)) NameError: nome 'data' non definito ' C'è un modo per definire i dati come sintassi valida? –

+0

@ StefanFörch mio male, quando ho modificato la risposta non ho modificato tutte le istanze della lista 'link'. Lo sto modificando ora. Quella linea è quella di aggiungere l'elenco dei collegamenti alla lista vuota precedentemente definita per essere utilizzata in seguito. – Bhargav

+0

Ok, grazie molte, il codice che aggiunge gli elementi dal file CSV a un elenco sembra funzionare, dal momento che 'print lists' dà' [['http://www.amsterdam.nl/', 'http : //www.rotterdam.nl/ ',' http://www.denhaag.nl/ ',' http://www.utrecht.nl ']] '. Tuttavia, quando si utilizza l'intero codice, non sembra funzionare. Presumo che questo potrebbe avere qualcosa a che fare con il formato del link, tuttavia, non vedo come il documento debba essere formattato, ad es. dovrebbero essere usate virgolette, dovrebbe essere una lista con valori in una singola colonna, ecc.? –

Problemi correlati