Saya mencoba mengekstrak data dari situs web. Halaman web memiliki lebih dari satu halaman, jadi saya mencoba menggunakan loop untuk beralih melalui halaman yang berbeda. Namun masalah dengan ini adalah saya tidak bisa mendapatkan href dari tombol berikutnya.

Adakah yang bisa menjelaskan bagaimana saya bisa memperbaikinya?

import csv
from datetime import datetime
import requests
from bs4 import BeautifulSoup

def get_url(position, location):
    "Generate a url from position and location"
    template = 'https://mx.indeed.com/jobs?q={}&l={}'
    url = template.format(position, location)
    return url

def get_record(card):
    spantag = card.h2.span
    job_title = spantag.get('title')
    job_url = 'https://www.indeed.com' + card.get('href')
    company = card.find('span', 'companyName').text
    job_location = card.find('div', 'companyLocation').text
    job_summary = card.find('div', 'job-snippet').text.strip()
    post_date = card.find('span', 'date').text
    today = datetime.today().strftime('%Y-%m-%d')
    
    record = (job_title, company, job_location, post_date, today, job_summary, job_url)
    
    return record

def main(position, location):
    records = []
    url = get_url(position, location)
    
    while True:
        response = requests.get(url)
        soup = BeautifulSoup(response.text, 'html.parser')
        cards = soup.find_all('a', 'tapItem')

        for card in cards:
            record = get_record(card)
            records.append(record)

            try:
                url = 'https://mx.indeed.com' + soup.find('a', {'aria-label':'Siguiente »'}).get('href')
            except AttributeError:
                break
    
    with open('results_Indeed.csv', 'w', newline = '', encoding = 'utf-8') as f:
        writer = csv.writer(f)
        writer.writerow(['JobTitle', 'Comany', 'Location', 'PostDate', 'Date', 'Summary', 'URL'])
        writer.writerows(records)
1
Benjamin Lopez 18 September 2021, 00:33

2 jawaban

Jawaban Terbaik

Coba pemilih CSS [aria-label*="Siguiente"] untuk menelusuri URL berikutnya:

import requests
import pandas as pd
from datetime import datetime
from bs4 import BeautifulSoup


def get_url(position, location):
    "Generate a url from position and location"
    template = "https://mx.indeed.com/jobs?q={}&l={}"
    url = template.format(position, location)
    return url


def get_record(card):
    spantag = card.h2.span
    job_title = spantag.get("title")
    job_url = "https://www.indeed.com" + card.get("href")
    company = card.find("span", "companyName").text
    job_location = card.find("div", "companyLocation").text
    job_summary = card.find("div", "job-snippet").text.strip()
    post_date = card.find("span", "date").text
    today = datetime.today().strftime("%Y-%m-%d")

    record = (
        job_title,
        company,
        job_location,
        post_date,
        today,
        job_summary,
        job_url,
    )

    return record


def main(position, location):
    records = []
    url = get_url(position, location)

    while True:
        print(url)
        response = requests.get(url)
        soup = BeautifulSoup(response.text, "html.parser")
        cards = soup.find_all("a", "tapItem")

        for card in cards:
            record = get_record(card)
            records.append(record)

        url = soup.select_one('[aria-label*="Siguiente"]')
        if not url:
            break
        url = "https://mx.indeed.com" + url["href"]

    df = pd.DataFrame(
        records,
        columns=[
            "JobTitle",
            "Comany",
            "Location",
            "PostDate",
            "Date",
            "Summary",
            "URL",
        ],
    )
    print(df)
    df.to_csv("data.csv", index=False)


main("Python", "Monterrey")

Membuat data.csv (tangkapan layar dari LibreOffice):

enter image description here

0
Andrej Kesely 17 September 2021, 21:46

Tombol di bagian bawah halaman diurutkan sebagai daftar, dan href adalah anak dari item daftar, seperti yang Anda lihat di tangkapan layar di bawah.

enter image description here

Namun, saya akan menyarankan pendekatan lain: coba gunakan mechanize. Ini adalah perpustakaan yang sangat mudah digunakan yang memungkinkan Anda memanipulasi halaman web seolah-olah Anda menggunakan browser. Dengan perpustakaan ini, Anda dapat mensimulasikan klik pada tombol next tanpa harus mengambil alamat tautannya.

0
Nir H. 17 September 2021, 21:57