<jupyter_start><jupyter_text>Scraping Indeed sivustosta 24.2   Johdato Tämä on osa projektityötä "2022 kesätyöanalyysi indeed-sivustosta: Python-työpaikkoja". Tässä ipynb-tiedostosta käytetään web scraping datankeräämiseen.<jupyter_code>import requests
from bs4 import BeautifulSoup
import re 
import pandas as pd
import numpy as np<jupyter_output>/home/degnaiyu/.local/lib/python3.8/site-packages/pandas/compat/_optional.py:149: UserWarning: Pandas requires version '1.3.1' or newer of 'bottleneck' (version '1.2.1' currently installed).
  warnings.warn(msg, UserWarning)<jupyter_text>Base link: https://fi.indeed.com/<jupyter_code>baselink= 'https://fi.indeed.com'<jupyter_output><empty_output><jupyter_text>Haulla 'Kesätyö' saatiin seuraava:<jupyter_code>url= 'https://fi.indeed.com/jobs?q=Kesätyö&start=0'<jupyter_output><empty_output><jupyter_text>Sivusto haulla 'Kesätyö':<jupyter_code>page=requests.get(url) #sivusto<jupyter_output><empty_output><jupyter_text>Sivuston html-script<jupyter_code>soup=BeautifulSoup(page.content,'html.parser' )<jupyter_output><empty_output><jupyter_text>Sivuston tietoaukeama  Tässä on kaikki olennaiset tiedot yhdestä aukeamasta<jupyter_code>maincontent= soup.find('tbody', id= 'resultsBodyContent')<jupyter_output><empty_output><jupyter_text>Sivujen numerot listana<jupyter_code>sivunumerot= list(range(10, 340, 10 ))     #ensimmäinen sivu ei huomioida<jupyter_output><empty_output><jupyter_text>Yhden sivun analysointi Analysoidaan yhtä sivua<jupyter_code>mozaiczone= maincontent.find('div' ,class_= 'mosaic-zone', id='mosaic-zone-jobcards' )   #tässä on kaikki työesitteet 
jobcards= mozaiczone.find_all('a',rel="nofollow",  target='_blank')   #tässä on kaikki linkkien esitteet<jupyter_output><empty_output><jupyter_text>Linkit kesätyöpaikkojen sivustoihin:<jupyter_code>jobcardlinklist=[]    
for job in jobcards:
    jobcardlinklist.append(baselink+ job['href'])<jupyter_output><empty_output><jupyter_text>Näytetään ensimmäiset linkit:<jupyter_code>jobcardlinklist<jupyter_output><empty_output><jupyter_text>Funktio työpaikan sivustolle: Funktio palauttaa työpaikan sivun tekstiosan.<jupyter_code>#testattu

def seulonta(link):
    webpage= requests.get(link) 
    bsoup= BeautifulSoup(webpage.content, 'html.parser')
    #työpaikan esite
    try: 
        jobdescriptiontext= bsoup.find('div', id="jobDescriptionText" ).text 
    except:
        return np.nan, np.nan, np.nan, np.nan
    #työpaikan nimike
    nimike= bsoup.find('h1', class_='icl-u-xs-mb--xs icl-u-xs-mt--none jobsearch-JobInfoHeader-title' ).text 
    
    
    #tässä on tekstipätkä, jossa on yrityksen nimi, arvostelun määrä (epäolennainen)
    # ja yrityksen sijaintikunta  
    companyinfo= bsoup.find('div', class_= "icl-u-xs-mt--xs icl-u-textColor--secondary jobsearch-JobInfoHeader-subtitle jobsearch-DesktopStickyContainer-subtitle").text 
    
    
    #poistetaan arvostelun määrä osio 
    if re.search(r'\d+ arvostelua', companyinfo): 
        companyinfo= re.sub(r'\d+ arvostelua', ',', companyinfo)
        
        companyinfo= companyinfo.split(',')  # companyinfo on nyt listana


        yritysnimi= companyinfo[0]
        paikkakunta= companyinfo[-1]
    
    elif 'arvostelua' not in companyinfo: 
        try: 
            yritysnimi, = re.findall(r'([a-zåäöA-ZÅÄÖ].+)[A-ZÅÄÖ]', companyinfo)
            paikkakunta = companyinfo.replace(yritysnimi, '')
        except: 
            yritysnimi =np.nan 
            paikkakunta=np.nan  
        
    else: 
        yritysnimi= np.nan 
        paikkakunta= np.nan
    
    return nimike, yritysnimi, paikkakunta, jobdescriptiontext
    
    
seulonta(jobcardlinklist[2])   #esimerkki<jupyter_output><empty_output><jupyter_text>Tiedon tallentaminen DataFrame-taulukkoon  Taulukko:<jupyter_code>frame= {'Työpaikan nimike':[], 'Yritysnimi': [], 'Sijaintikunta': [], 'Seloste': []}
for link in jobcardlinklist:
    nimike, yritysnimi, paikkakunta, jobdescriptiontext = seulonta(link)
    frame['Työpaikan nimike'].append(nimike)
    frame['Yritysnimi'].append(yritysnimi)
    frame['Sijaintikunta'].append(paikkakunta)
    frame['Seloste'].append(jobdescriptiontext)
    
pd.DataFrame(frame).head()<jupyter_output><empty_output><jupyter_text>Monen sivun analysointi Tässä osassa toistetaan edelliset vaiheet. Tarkoituksena on analysoida kaikki sivut, jotka liittyvät kesätyöpaikkaan.<jupyter_code>for sivunumero in sivunumerot:
    #muutetaan sivunumeroa 
    url = re.sub('\d+$', str(sivunumero), url)   
    
    #päästään sivun html-scriptiin
    page=requests.get(url)
    soup= BeautifulSoup(page.content, 'html.parser')
    
    #sisältö-alue 
    maincontent= soup.find('tbody', id= 'resultsBodyContent')
    
    #työpaikkojen esitteet 
    mozaiczone= maincontent.find('div' ,class_= 'mosaic-zone', id='mosaic-zone-jobcards' )   #tässä on kaikki työesitteet 
    jobcards= mozaiczone.find_all('a',rel="nofollow",  target='_blank')   #tässä on kaikki linkkien esitteet  

    
    jobcardlinklist=[] #nollataan lista 
    
    #tallennetaan sivuston linkit listaan 
    for job in jobcards:
        jobcardlinklist.append(baselink+ job['href'])
        
        
    for link in jobcardlinklist:
        nimike, yritysnimi, paikkakunta, jobdescriptiontext = seulonta(link)
        frame['Työpaikan nimike'].append(nimike)
        frame['Yritysnimi'].append(yritysnimi)
        frame['Sijaintikunta'].append(paikkakunta)
        frame['Seloste'].append(jobdescriptiontext)<jupyter_output><empty_output><jupyter_text>Näköjään esiintyi recaptcha-botti. Jatketaan edellistä seulontaa.<jupyter_code>for sivunumero in range(170,340, 10 ): 
    #muutetaan sivunumeroa 
    url = re.sub('\d+$', str(sivunumero), url)   
    
    #päästään sivun html-scriptiin
    page=requests.get(url)
    soup= BeautifulSoup(page.content, 'html.parser')
    
    #sisältö-alue 
    maincontent= soup.find('tbody', id= 'resultsBodyContent')
    
    #työpaikkojen esitteet 
    mozaiczone= maincontent.find('div' ,class_= 'mosaic-zone', id='mosaic-zone-jobcards' )   #tässä on kaikki työesitteet 
    jobcards= mozaiczone.find_all('a',rel="nofollow",  target='_blank')   #tässä on kaikki linkkien esitteet  

    
    jobcardlinklist=[] #nollataan lista 
    
    #tallennetaan sivuston linkit listaan 
    for job in jobcards:
        jobcardlinklist.append(baselink+ job['href'])
        
        
    for link in jobcardlinklist:
        nimike, yritysnimi, paikkakunta, jobdescriptiontext = seulonta(link)
        frame['<NAME>'].append(nimike)
        frame['Yritysnimi'].append(yritysnimi)
        frame['Sijaintikunta'].append(paikkakunta)
        frame['Seloste'].append(jobdescriptiontext)


sivunumero<jupyter_output><empty_output><jupyter_text>Sivunumero on kunnossa. Lukeminen onnistui   Data muunnetaan taulukoksi pd.DataFrame<jupyter_code>dataframe= pd.DataFrame(frame)<jupyter_output><empty_output><jupyter_text>Tallennetaan taulukko json tiedostona:<jupyter_code>#data=dataframe.to_json('./scrapingresult.json')<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.11508332146417889, 'fraction_numerical': 0.005554764278592793, 'mean_word_length': 4.67663702506063, 'pattern_counts': {'":': 0, '<': 65, '<?xml version=': 0, '>': 65, 'https://': 3, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '16', 'dir': 'jupyter-structured-clean-dedup', 'id': '532368', 'license': 'MIT', 'n_tokens_mistral': 2831, 'n_tokens_neox': 2720, 'n_words': 406, 'path': 'webscraping.ipynb', 'repo_name': 'Absolute7070/Kesatyo-2022-data-analyysi', 'size': '7031'}