Conas Liostaí Poist a Scrape go deimhin ag baint úsáide as Python

Tuairimí: 0

Maidir le sealgairí poist, fostóirí, nó aon duine a dhéanann monatóireacht ar threochtaí sa mhargadh fostaíochta, d’fhéadfadh sé go gcuirfeadh scríobadh liosta na bpost atá ar fáil faisnéis chabhrach ar fáil. Sa rang teagaisc áirithe seo, cuirfimid an drámadóir le chéile le haghaidh scríobadh gréasáin agus LXML le haghaidh parsáil ábhair HTML chun sonraí an phoist a bhailiú lena n -áirítear a theideal, ainm na cuideachta earcaíochta, suíomh, cur síos poist Torthaí tríd an bhfaisnéis a shábháil i gcomhad CSV.

Réamhriachtanais

Chun scríobadh a dhéanamh go rathúil, ní mór na leabharlanna Python seo a leanas a shuiteáil.

Drámadóir le haghaidh uathoibriú brabhsálaí:


pip install playwright

LXML chun HTML a pharsáil:


pip install lxml

Pandas chun sonraí a shábháil ar chomhad CSV:


pip install pandas

Suiteáil brabhsálaithe drámadóra :

Tar éis an drámadóir a shuiteáil, rith an t -ordú seo chun na binaries brabhsálaí riachtanacha a shuiteáil:


playwright install

Céim 1: Drámadóir a chur ar bun le haghaidh scríobadh gréasáin

Ceadaíonn an drámadóir duit brabhsálaithe gréasáin a uathoibriú agus idirghníomhú. Tosaímid trí dhrámadóir a bhunú chun brabhsálaí cróimiam a sheoladh, cuairt a thabhairt ar leathanach gréasáin, agus a ábhar a bhaint amach. Anseo is féidir linn proxies a chur ar aghaidh tríd an drámadóir freisin.

Cén fáth a n -úsáidtear proxies?

Is minic a bhíonn bearta a theorannaíonn ráta nó frith-scrapáil i bhfeidhm ag láithreáin ghréasáin chun iarratais arís agus arís eile a bhlocáil ón seoladh IP céanna. Tugann seachvótálaithe deis duit:

  • Seachain blocáil IP: Dáiligh do chuid iarratas trí IPanna éagsúla chun braite a sheachaint.
  • Geolocation ag seachaint: Rochtain ar liostaí poist a d'fhéadfaí a shrianadh bunaithe ar shuíomhanna geografacha.
  • Gan ainm: Folaigh do IP iarbhír agus fan gan ainm le linn an phróisis scríobtha.

import asyncio
from playwright.async_api import async_playwright

async def get_page_content(url):
    async with async_playwright() as p:
        browser = await p.chromium.launch(
            headless=False,
            proxy = {
                'server': '',
                'username': '',
                'password': ''
            }
        )  # Brabhsálaí faoi cheannas
        page = await browser.new_page()
        await page.goto(url)
        
        # Sliocht ábhar an leathanaigh
        content = await page.content()
        
        await browser.close()  # Dún an brabhsálaí uair amháin
        return content

Sa chód seo, seolann Async_Playwright brabhsálaí faoi cheannas, nascleanann sé chuig an URL sonraithe, agus faigheann sé ábhar an leathanaigh.

Parsáil Ábhar HTML ag baint úsáide as LXML

Ansin, déanfaimid ábhar an leathanaigh a pharsáil chun sonraí bríocha a bhaint amach. Baintear úsáid as LXML chun na críche seo toisc go dtugann sé tacaíocht láidir do pharsáil agus do cheist HTML ag baint úsáide as XPath.


from lxml import html

def parse_job_listings(content):
    # Ábhar HTML a pharsáil
    parser = html.fromstring(content)
    
    # Sliocht gach postáil poist ag úsáid xpath
    job_posting = parser.xpath('//ul[@class="css-zu9cdh eu4oa1w0"]/li')
    
    jobs_data = []
    for element in job_posting[:-1]:  # Scipeáil an ghné dheireanach más ad nó neamhábhartha é
        title = ''.join(element.xpath('.//h2/a/span/@title'))
        if title:
            link = ''.join(element.xpath('.//h2/a/@href'))
            location = ''.join(element.xpath('.//div[@data-testid="text-location"]/text()'))
            description = ', '.join(element.xpath('.//div[@class="css-9446fg eu4oa1w0"]/ul//li/text()'))
            company_name = ''.join(element.xpath('.//span[@data-testid="company-name"]/text()'))

            # Cuir sonraí a bhaint as an liosta jobs_data
            jobs_data.append({
                'Title': title,
                'Link': f"https://www.indeed.com{link}",
                'Location': location,
                'Description': description,
                'Company': company_name
            })
    
    return jobs_data

Céim 2: Liostaí Poist a Scrapáil

Anois go bhfuil céimeanna uathoibrithe agus parsála an bhrabhsálaí curtha ar bun againn, déanaimis iad a chur le chéile chun liostaí poist a scrape ón leathanach go deimhin.

Míniú :

  • get_page_content(url): Féachann sé ar ábhar an leathanaigh ag baint úsáide as drámadóir.
  • parse_job_listings(content): Déanann sé an t -ábhar a pharsáil ag baint úsáide as LXML agus sleachta sonraí poist.
  • main(): Déanann sé an próiseas scríobtha a eagrú, sonraí a fháil agus é a shábháil ar chomhad CSV.

import pandas as pd

async def scrape_indeed_jobs(url):
    # Céim 1: Faigh Ábhar Leathanach ag baint úsáide as drámadóir
    content = await get_page_content(url)
    
    # Céim 2: An HTML a pharsáil agus Sonraí Poist Sliocht
    jobs_data = parse_job_listings(content)
    
    return jobs_data

# Url go scrape
url = 'https://www.indeed.com/q-usa-jobs.html'

# Sonraí a scríobadh agus a shábháil
async def main():
    # Scrape sonraí poist ón URL sonraithe
    jobs = await scrape_indeed_jobs(url)
    
    # Céim 3: Sábháil sonraí chuig CSV ag úsáid Pandas
    df = pd.DataFrame(jobs)
    df.to_csv('indeed_jobs.csv', index=False)
    
    print("Data saved to indeed_jobs.csv")

# Rith an phríomhfheidhm
asyncio.run(main())

Céim 3: Tacaíocht a chur le chéile

Go deimhin, cuireann sé a liostaí poist i leataobh, agus is féidir leat an scraper a leathnú go héasca chun leathanaigh éagsúla a láimhseáil. Déantar an URL Leathanach a choigeartú ag úsáid tús paraiméadair fiosrúcháin, a incrimíonn faoi 10 do gach leathanach nua.

Chun feidhmiúlacht do scraper a fheabhsú chun sonraí a bhailiú ó leathanaigh éagsúla, is féidir leat feidhm ar a dtugtar scrape_multiple_pages a chur i bhfeidhm. Athróidh an fheidhm seo an bonn URL tríd an bparaiméadar tosaithe a choigeartú go hincriminteach, rud a chumasaíonn rochtain ar leathanaigh ina dhiaidh sin. Trí dhul chun cinn go córasach trí gach leathanach, is féidir leat scóip agus méid na sonraí a bhailítear a leathnú, amhail folúntais, ag cinntiú tacar sonraí níos cuimsithí.


async def scrape_multiple_pages(base_url, pages=3):
    all_jobs = []
    
    for page_num in range(pages):
        # Nuashonraigh URL le haghaidh laghdú
        url = f"{base_url}&start={page_num * 10}"
        print(f"Scraping page: {url}")
        
        # Scrape sonraí poist ó gach leathanach
        jobs = await scrape_indeed_jobs(url)
        all_jobs.extend(jobs)
    
    # Sábháil gach post chuig CSV
    df = pd.DataFrame(all_jobs)
    df.to_csv('indeed_jobs_all_pages.csv', index=False)
    print("Data saved to indeed_jobs_all_pages.csv")

# Scrape leathanaigh éagsúla de liostaí poist
asyncio.run(scrape_multiple_pages('https://www.indeed.com/jobs?q=usa', pages=3))

Céim 4: Ceisteanna cuardaigh poist a shaincheapadh

Chun díriú ar theidil poist nó eochairfhocail ar leith i do chuid iarrachtaí scríobtha, beidh ort an paraiméadar cuardaigh fiosrúcháin a chumrú san URL a úsáideann go deimhin. Ligeann an saincheapadh seo don scraper sonraí a bhailiú a bhaineann go sonrach le poist nó earnálacha áirithe. Mar shampla, má tá tú ag cuardach poist fhorbróra Python ar http://www.indeed.com, dhéanfá an paraiméadar fiosrúcháin a choigeartú chun “Python+Forbróir” nó eochairfhocail ábhartha a chur san áireamh.


query = "python+developer"
base_url = f"https://www.indeed.com/jobs?q={query}"
asyncio.run(scrape_multiple_pages(base_url, pages=3))

Tríd an paraiméadar seo a mhodhnú de réir do riachtanais bailithe sonraí, is féidir leat do scríobadh a dhíriú ar phoist shonracha, solúbthacht agus éifeachtúlacht do phróisis bailithe sonraí a fheabhsú. Tá an cur chuige seo thar a bheith úsáideach chun oiriúnú d'éilimh dhinimiciúla an mhargaidh fostaíochta.

Cód Comhlánaithe


import asyncio
from playwright.async_api import async_playwright
from lxml import html
import pandas as pd

# Céim 1: Fetch Page Content ag úsáid drámadóra
async def get_page_content(url):
    async with async_playwright() as p:
        browser = await p.chromium.launch(
            headless=False
            proxy = {
                'server': '',
                'username': '',
                'password': ''
            }
        )  # Brabhsálaí Rith i Mód Ceannaithe
        page = await browser.new_page()
        await page.goto(url, wait_until='networkidle')
        
        # Sliocht Ábhar Leathanach
        content = await page.content()
        await browser.close()  # Dún brabhsálaí tar éis a úsáid
        return content

# Céim 2: An t -ábhar HTML a pharsáil ag úsáid LXML
def parse_job_listings(content):
    # Parse an HTML ag baint úsáide as LXML
    parser = html.fromstring(content)
    
    # Roghnaigh postálacha poist aonair ag baint úsáide as xpath
    job_posting = parser.xpath('//ul[@class="css-zu9cdh eu4oa1w0"]/li')
    
    # Sonraí Poist a Shliocht
    jobs_data = []
    for element in job_posting[:-1]:
        title = ''.join(element.xpath('.//h2/a/span/@title'))
        if title:
            link = ''.join(element.xpath('.//h2/a/@href'))
            location = ''.join(element.xpath('.//div[@data-testid="text-location"]/text()'))
            description = ', '.join(element.xpath('.//div[@class="css-9446fg eu4oa1w0"]/ul//li/text()'))
            company_name = ''.join(element.xpath('.//span[@data-testid="company-name"]/text()'))

            # Cuir sonraí a bhaint as an liosta jobs_data
            jobs_data.append({
                'Title': title,
                'Link': f"https://www.indeed.com{link}",
                'Location': location,
                'Description': description,
                'Company': company_name
            })
    
    return jobs_data

# Céim 3: Scrape go deimhin poist ar leathanach amháin
async def scrape_indeed_jobs(url):
    # Faigh Ábhar Leathanach ag baint úsáide as drámadóir
    content = await get_page_content(url)
    
    # Parse HTML agus Sonraí Poist a Shliocht
    jobs_data = parse_job_listings(content)
    
    return jobs_data

# Céim 4: Láimhseáil a láimhseáil agus leathanaigh iolracha a scrapáil
async def scrape_multiple_pages(base_url, query, pages=3):
    all_jobs = []
    
    for page_num in range(pages):
        # Nuashonraigh an URL chun an t -uafás a láimhseáil agus cuir an cheist cuardaigh leis
        url = f"{base_url}?q={query}&start={page_num * 10}"
        print(f"Scraping page: {url}")
        
        # Scrape poist don leathanach reatha
        jobs = await scrape_indeed_jobs(url)
        all_jobs.extend(jobs)
    
    # Sábháil gach post le comhad CSV
    df = pd.DataFrame(all_jobs)
    df.to_csv(f'indeed_jobs_{query}.csv', index=False)
    print(f"Data saved to indeed_jobs_{query}.csv")

# Feidhm chun an scraper a rith le hionchur ceist dhinimiciúil
async def run_scraper():
    # Céim 5: Iarr ar an úsáideoir ceist ionchuir agus líon na leathanach a scrapáil
    query = input("Enter the job title or keywords to search (e.g., python+developer): ")
    pages = int(input("Enter the number of pages to scrape: "))
    
    # Poist scrape thar leathanaigh éagsúla bunaithe ar an bhfiosrúchán
    base_url = 'https://www.indeed.com/jobs'
    await scrape_multiple_pages(base_url, query, pages)

# Rith an scraper
asyncio.run(run_scraper())

Chun próiseas scríobtha réidh a chinntiú agus an baol go dtarlódh bloic agus láithrithe Captcha a laghdú, tá sé ríthábhachtach an seachfhreastalaí ceart a roghnú. Is iad na roghanna is fearr le haghaidh scríobtha ná seachvótálaithe ISP, a sholáthraíonn cobhsaíocht ardluais agus nasctha, chomh maith le fachtóir ard iontaobhais, rud a fhágann gur annamh a chuireann ardáin bac orthu. Tá an cineál seo seachvótálaí statach, mar sin le haghaidh scríobadh mórscála, is gá linn snámhghnóthais ISP a chruthú agus uainíocht IP a chumrú dá n-athrú rialta. Rogha eile a bheadh ​​ann ná seachvótálaithe cónaitheacha, atá dinimiciúil agus a bhfuil an clúdach geografach is leithne acu i gcomparáid le cineálacha eile seachfhreastalaithe.

Tuairimí:

0 tuairimí