1
votes

gratter les 100 meilleurs résultats de travail en utilisant en effet BeautifulSoup python

Je suis nouveau dans le scraping Web python et je voudrais gratter les 100 meilleurs résultats de travail et je ne peux que gratter les résultats de la première page, c'est-à-dire les 10 premiers. Ceci est mon code et quelqu'un peut-il m'aider à résoudre ce problème?

import urllib2
from bs4 import BeautifulSoup
import json

URL = "https://www.indeed.co.in/jobs?q=software+developer&l=Bengaluru%2C+Karnataka"
soup = BeautifulSoup(urllib2.urlopen(URL).read(), 'html.parser')

results = soup.find_all('div', attrs={'class': 'jobsearch-SerpJobCard'})

for x in results:
company = x.find('span', attrs={"class":"company"})
print 'company:', company.text.strip()

job = x.find('a', attrs={'data-tn-element': "jobTitle"})
print 'job:', job.text.strip()


1 commentaires

J'ai ajouté une réponse pouvez-vous s'il vous plaît vérifier.


3 Réponses :


1
votes

Faites-le par lots de 10 en modifiant la valeur de départ dans l'url. Vous pouvez incrémenter en boucle et ajouter la variable add

https://www.indeed.co.in/jobs?q=software+developer&l=Bengaluru%2C+Karnataka&start=0

https://www.indeed.co.in/jobs?q=software+developer&l=Bengaluru , + Karnataka & start = 1

Eg

import requests
from bs4 import BeautifulSoup as bs
import pandas as pd
results = []
url = 'https://www.indeed.co.in/jobs?q=software+developer&l=Bengaluru,+Karnataka&start={}'
with requests.Session() as s:
    for page in range(5):
        res = s.get(url.format(page))
        soup = bs(res.content, 'lxml')
        titles = [item.text.strip() for item in soup.select('[data-tn-element=jobTitle]')]
        companies = [item.text.strip() for item in soup.select('.company')]
        data = list(zip(titles, companies))
        results.append(data)
newList = [item for sublist in results for item in sublist]
df = pd.DataFrame(newList)
df.to_json(r'C:\Users\User\Desktop\data.json')


8 commentaires

pouvez-vous le stocker dans un fichier json?


La réponse est probablement oui. Je ferais apparaître les listes et les convertirais en df et voir si les pandas ont une méthode Json


J'ai juste essayé. Mais dans la console, les résultats semblent assez embarrassants. Pouvez-vous les stocker au format json.


S'il y a quelque chose à améliorer, veuillez me le faire savoir. Vous devez modifier le chemin.


Merci pour cette réponse. Pouvez-vous me donner un format json comme {"Company": "name Of Company", "title": "job title"}


Bien sur. Votez cette question si vous pensez qu'elle est utile à d'autres développeurs.


Excuses. J'aurais dû le faire en premier lieu. C'était juste très tôt le matin!


Comment puis-je y ajouter du multitraitement / multithreading et quand mettre en parallèle.



1
votes

Essayez le code ci-dessous.Il naviguera jusqu'à la page suivante jusqu'à 10 pages.Si vous voulez prendre plus de 100 enregistrements, remplacez simplement while page_num par while True: code>

from bs4 import BeautifulSoup
import pandas as pd
import re
headers = {'User-Agent':
       'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.106 Safari/537.36'}

page = "https://www.indeed.co.in/jobs?q=software+developer&l=Bengaluru%2C+Karnataka"
company_name = []
job_title = []
page_num = 10
session = requests.Session()
while True:
    pageTree = session.get(page, headers=headers)
    pageSoup = BeautifulSoup(pageTree.content, 'html.parser')
    jobs= pageSoup.find_all("a", {"data-tn-element": "jobTitle"})
    Companys = pageSoup.find_all("span", {"class": "company"})
    for Company, job in zip(Companys, jobs):
        companyname=Company.text
        company_name.append(companyname.replace("\n",""))
        job_title.append(job.text)
    if pageSoup.find("span", text=re.compile("Next")):
        page = "https://www.indeed.co.in/jobs?q=software+developer&l=Bengaluru%2C+Karnataka&start={}".format(page_num)
        page_num +=10
    else:
        break

print(company_name)
print(job_title)
df = pd.DataFrame({"company_name":company_name,"job_title":job_title})
print(df.head(1000))


13 commentaires

Ouais. Ça marche. Pouvez-vous s'il vous plaît m'expliquer la logique.


Vous devez utiliser requests.session pour parcourir plusieurs pages.Si vous cliquez sur la page suivante, vous verrez le compteur augmente de 10 par page.Dans mon code, j'ai ajouté le compteur 10.


Ouais. Cela m'a vraiment aidé. savez-vous comment le stocker dans un css dans un ordre.


Pouvez-vous s'il vous plaît accepter ma réponse.Vous utilisez des pandas pour stocker dans l'ordre.Je ne sais pas à propos du CSS.


J'ai mis à jour ma réponse avec pandas.Veuillez vérifier et accepter ma réponse si cela vous aide.


Je vais. Cela m'a vraiment aidé. votez pour la question si vous pensez qu'elle est utile pour d'autres développeurs.


puis-je améliorer à 1000 résultats si je le souhaite?


Oui, vous pouvez également passer à 1000.


page_num = 100?


essayez tout en vrai:


Mise à jour de la réponse. Essayez simplement


J'ai mis à jour le code, ai-je essayé d'exécuter le code?


df = pd.DataFrame ({"company_name": company_name, "job_title": job_ti‌ tle}) pour les URL de la page: json_file2 = open ('fin.json', 'w') json.dump (df, json_file2) json_file2.close () C'est ce que j'ai essayé de créer un fichier json. Mais en dernier, obtenir une erreur comme celle-ci [144 lignes x 2 colonnes] n'est pas sérialisable JSON



1
votes

Vous pouvez le faire si vous incluez votre code dans une boucle de plage:

from bs4 import BeautifulSoup
import json
import urllib2

URL = "https://www.indeed.co.in/jobs?q=software+developer&l=Bengaluru%2C+Karnataka&start="

for i in range(0 , 100 , 10):
    soup = BeautifulSoup(urllib2.urlopen(URL+str(i)).read(), 'html.parser')
    results = soup.find_all('div', attrs={'class': 'jobsearch-SerpJobCard'})
    for x in results:
        company = x.find('span', attrs={"class":"company"})
        print 'company:', company.text.strip()

        job = x.find('a', attrs={'data-tn-element': "jobTitle"})
        print 'job:', job.text.strip()  


5 commentaires

Quelle erreur avez-vous? J'avoue avoir testé cela en utilisant le package requests et non urllib2


Échec temporaire de la résolution de nom c'est l'erreur que j'obtiens à la ligne 8.


C'est une bonne réponse. Maintenant, je l'ai vérifié à nouveau et aucune erreur. Merci.


bien sûr je pense. Jetez un œil à concurrent.futures.ProcessPoolExecutor () et requests.Session ()


en fait, je suis nouveau dans ce domaine. mais cela semble intéressant et je voulais l'apprendre. Peux-tu être plus précis. Je serai reconnaissant si vous m'aidez.