2017-12-08 4 views
1

Ich versuche, mehrere Seiten einer URL zu kratzen.Kratzen mehrere Seiten mit schönen Suppe

Aber ich bin in der Lage, nur die erste Seite zu kratzen gibt es eine Möglichkeit, alle Seiten zu bekommen.

Hier ist mein Code.

from bs4 import BeautifulSoup as Soup 
import urllib, requests, re, pandas as pd 

pd.set_option('max_colwidth',500) # to remove column limit (Otherwise, we'll lose some info) 
df = pd.DataFrame() 

Comp_urls = ['https://www.indeed.com/jobs?q=Dell&rbc=DELL&jcid=0918a251e6902f97', 'https://www.indeed.com/jobs?q=Harman&rbc=Harman&jcid=4faf342d2307e9ed','https://www.indeed.com/jobs?q=johnson+%26+johnson&rbc=Johnson+%26+Johnson+Family+of+Companies&jcid=08849387e791ebc6','https://www.indeed.com/jobs?q=nova&rbc=Nova+Biomedical&jcid=051380d3bdd5b915'] 

for url in Comp_urls: 
    target = Soup(urllib.request.urlopen(url), "lxml") 
    targetElements = target.findAll('div', class_ =' row result') 

    for elem in targetElements: 
     comp_name = elem.find('span', attrs={'class':'company'}).getText().strip() 
     job_title = elem.find('a', attrs={'class':'turnstileLink'}).attrs['title'] 
     home_url = "http://www.indeed.com" 
     job_link = "%s%s" % (home_url,elem.find('a').get('href')) 
     job_addr = elem.find('span', attrs={'class':'location'}).getText() 
     date_posted = elem.find('span', attrs={'class': 'date'}).getText() 
     description = elem.find('span', attrs={'class': 'summary'}).getText().strip() 


     comp_link_overall = elem.find('span', attrs={'class':'company'}).find('a') 
     if comp_link_overall != None: 
     comp_link_overall = "%s%s" % (home_url, comp_link_overall.attrs['href']) 
     else: comp_link_overall = None 

     df = df.append({'comp_name': comp_name, 'job_title': job_title, 
       'job_link': job_link, 'date_posted': date_posted, 
       'overall_link': comp_link_overall, 'job_location': job_addr, 'description': description 
       }, ignore_index=True) 


df 

df.to_csv('path\\web_scrape_Indeed.csv', sep=',', encoding='utf-8') 

Bitte schlagen Sie vor, wenn es überhaupt gibt.

+0

Sie haben falsche Einrückungen. Das zweite 'für' muss innen sein zuerst' für' – furas

Antwort

1

Fall 1: Der Code hier präsentiert ist genau das, was Sie

Comp_urls = ['https://www.indeed.com/jobs?q=Dell&rbc=DELL&jcid=0918a251e6902f97', 'https://www.indeed.com/jobs?q=Harman&rbc=Harman&jcid=4faf342d2307e9ed','https://www.indeed.com/jobs?q=johnson+%26+johnson&rbc=Johnson+%26+Johnson+Family+of+Companies&jcid=08849387e791ebc6','https://www.indeed.com/jobs?q=nova&rbc=Nova+Biomedical&jcid=051380d3bdd5b915'] 

for url in Comp_urls: 
    target = Soup(urllib.request.urlopen(url), "lxml") 
    targetElements = target.findAll('div', class_ =' row result') 

for elem in targetElements: 

Das Problem hier haben, ist targetElements Änderungen bei jeder Iteration in dem ersten for-Schleife.

Um dies zu vermeiden, eine Kerbe in die zweiten for-Schleife innerhalb der ersten etwa so:

for url in Comp_urls: 
    target = Soup(urllib.request.urlopen(url), "lxml") 
    targetElements = target.findAll('div', class_ =' row result') 

    for elem in targetElements: 

Falles 2: Sie der Fehler nicht durch unsachgemäße Vertiefung ist(dh nicht wie, was in Ihnen ursprünglicher Beitrag) Wenn es der Fall ist, dass Ihr Code richtig idented ist, dann kann es der Fall sein, dass targetElements eine leere Liste ist. Dies bedeutet, target.findAll('div', class_ =' row result') gibt nichts zurück. In diesem Fall besuchen Sie die Websites, sehen Sie sich das Dom an und ändern Sie dann Ihr Scraping-Programm.

+0

, wie du im zweiten Fall sagst, welche Seiten ich überprüfen soll. –

+0

alle Websites, die Sie derzeit nicht bearbeiten können. Sie können sie in einer Liste abfangen und anschließend ausdrucken. Etwas wie 'unscraped = []' vor der ersten 'for' Anweisung und sofort nach' targetElements = target.findAll ('div', class_ = 'row result') ', tue' falls nicht targetElements: unscraped.append (url) ' –

+0

Vielen Dank für die schnelle Antwort, ich habe versucht, wie Sie vorgeschlagen, und ich bekomme alle Daten für die erste Seite der Websites, aber wie kann ich Daten von allen Seiten bekommen. –

Verwandte Themen