#python #web-scraping #beautifulsoup
#питон #очистка веб-страниц #beautifulsoup #python
Вопрос:
Я новичок в веб-очистке python, и я хотел бы очистить 100 лучших результатов заданий от indeed, но я могу очистить только результаты первой страницы, то есть top 10. Я использую фреймворк BeautifulSoup. Это мой код, и кто-нибудь может помочь мне с этой проблемой?
import urllib2
from bs4 import BeautifulSoup
import json
URL = "https://www.indeed.co.in/jobs?q=software developeramp;l=Bengaluru, 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. Я добавил ответ, можете ли вы, пожалуйста, проверить.
Ответ №1:
Выполняйте это партиями по 10, изменяя начальное значение в URL. Вы можете выполнять циклическое увеличение и добавлять переменную add
Например.
import requests
from bs4 import BeautifulSoup as bs
import pandas as pd
results = []
url = 'https://www.indeed.co.in/jobs?q=software developeramp;l=Bengaluru, Karnatakaamp;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:UsersUserDesktopdata.json')
Комментарии:
1. можете ли вы сохранить это в файле json?
2. Ответ, вероятно, да. Я бы вывел списки и преобразовал в df и посмотрел, есть ли у pandas метод Json
3. Я просто пытался. Но в консоли результаты выглядят довольно неловко. Можете ли вы сохранить их в формате json.
4. Если есть что-то, что нуждается в улучшении, пожалуйста, дайте мне знать. Вам нужно изменить путь.
5. Спасибо за этот ответ. Можете ли вы предоставить мне формат json, например
{"Company":"nameOfCompany", "title":"jobtitle"}
Ответ №2:
Вы можете сделать это, если включите свой код в цикл range:
from bs4 import BeautifulSoup
import json
import urllib2
URL = "https://www.indeed.co.in/jobs?q=software developeramp;l=Bengaluru, Karnatakaamp;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()
Комментарии:
1. Какая у вас ошибка? Я признаю, что я тестировал это с помощью
requests
пакета, а неurllib2
2.
Temporary failure in name resolution
эту ошибку я получаю в строке 8.3. Это хороший ответ. Теперь я проверил это снова и никакой ошибки. Спасибо.
4. конечно, я думаю. Взгляните на
concurrent.futures.ProcessPoolExecutor()
иrequests.Session()
5. на самом деле я новичок в этом. но это кажется интересным, и я хотел его изучить. Не могли бы вы быть более конкретными. Я буду благодарен, если вы мне поможете.
Ответ №3:
Попробуйте приведенный ниже код.Это приведет к переходу на следующую страницу длиной до 10 страниц.Если вы хотите взять более 100 записей, просто замените while page_num<100:
на while True:
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 developeramp;l=Bengaluru, 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 developeramp;l=Bengaluru, Karnatakaamp;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))
Комментарии:
1. Да. Это работает. Не могли бы вы, пожалуйста, объяснить мне логику.
2. Вы должны использовать requests.session для просмотра нескольких страниц. если вы нажмете на следующую страницу, вы увидите, что счетчик увеличивается на 10 с каждой страницы. В моем коде я добавил счетчик 10.
3. да. Это действительно помогло мне. знаете ли вы, как сохранить это в css в порядке.
4. Можете ли вы, пожалуйста, принять мой ответ. Вы используете pandas для хранения по порядку. Я не знаю о css.
5. Я обновил свой ответ с помощью pandas. пожалуйста, проверьте и примите мой ответ, если это поможет.