stackoverflow.comパッチワークとCSVを入れる


1.stackoverflowサイトのキャプチャ


indeed.comでブラシしたコードはほとんど差がありません.だから私は他のコードを少し見たいだけです.
import requests
from bs4 import BeautifulSoup

URL ="https://stackoverflow.com/jobs?q=python&sort=i"

def so_last_page():
    result = requests.get(URL)
    soup = BeautifulSoup(result.text, "html.parser")
    pagi = soup.find("div", {"class":"s-pagination"}).find_all("a")           
    last = pagi[-2].get_text(strip=True) #get_text() 함수를 이용해, pagi 안에 텍스트(페이지넘버)를 불러들이고 strip 해서 정리해줌.(이런식으로 strip=true를 인자로 사용가능)
    return int(last)
    # indeed 서 처럼 link에서 span을 다 뽑아서 리스트에 넣은다음 리스트 마지막 숫자만 뽑아내도 좋고
    # 여기서 처럼 아예 링크 마지막 부분을 애초부터 뽑아내도 괜찮다.

def extract_job(html):    
    title = html.find("h2", {"class": "mb4"}).find("a")["title"]
    company = html.find("h3", {"class":"fc-black-700"}).find("span").get_text(strip=True) 
    location = html.find("span", {"class": "fc-black-500"}).get_text(strip=True) 
    # strip=True 를 대입하지 않으면 띄어쓰기가 그대로 남아있게되어 듬성듬성 빈틈이 생긴다. 
    # 참고로 .string()/.strip() 함수로 태그안에 있는 텍스트만 깔끔하게 뽑아내려 했으나 get_text는 위의 함수와 incompatible 하기 때문에 사용하지 못했다.
    job_id = html["data-jobid"]
    link = f"https://stackoverflow.com/jobs?id={job_id}&q=python"
    
    return {'Title': title , 
            'Company': company , 
            'location': location, 
            'link':link
            }
私のような人は、なぜか分かりませんが、ニコとサイトhtmlのコード配列が違って使い方がない方法を書きたいです.
 < 사용안했지만, 니코는 사용한것>

 tuple unpacking(mutiple assignment)--알아보자!(밑에 계속)

 장소와 회사변수를 각각 지정안해주고 한번에 지정할 수 있음
 우선 다음과 같은 코드를 살펴보자
 company,location = html.find("div", {"class": "-company"}).find_all("span",recursive=False)
 
 recursive = false 는 무슨뜻이냐면, 안에 속해있는 모든 자손을 불러오지 말고 직계자손만, first level 만 불러옴!
 예를 들어 아래와 같은 html 코드가 있다고 치고. 위에 코드를 쳤다고 치자.

<div class = -company >
  <span class = a>
    KIA
    <span class = b>LOL</span>
  </span> 
  <span class = a1>
    KOREA
  </span>
</div>

 그럼 직계자손 span 만 불러오므로 결과값은 company = KIA, location = KOREA 가 된다.

CSVを入れる


これで2つのサイトのページパッチワークが完了しました.アクセルを入れることしか残っていません.アクセルはウィンドウでしか動作しないため、GOGLEがサポートするCSV形式でデータを格納できます.
まず、CSVは以下のような非常に単純な形式で構成される.
title,company,location,link

DevOps - Principal Engineer,Innominds Software,"Bengaluru, India",https://stackoverflow.com/jobs?id=404137&q=python

DevOps Engineer,Star Knowledge,"Bengaluru, India",https://stackoverflow.com/jobs?id=404118&q=python
幸いなことに、Pythonはcsvモジュールをデフォルトでサポートしています.
まずはsave.pyファイルをそれぞれ作成し、次のコードを入力します.
import csv

def save_to_file(jobs):
    file = open("C:\python scraper\jobs.csv", mode="w" ,encoding = "utf-8-sig") # 파일 이름이 없으면 자동으로 파일 생성. 그리고 일본어,중국어 때문에 파일이 깨진다면 -sig를 encoding에 추가!
    writer = csv.writer(file) # 만든 파일안애 데이터 입력
    writer.writerow(["title", "company", "location", "link"]) # 요런 식으로
    for job in jobs:
        writer.writerow(list(job.values())) 
        # 그리고 긁어온 데이터를 jobs 인자를 이용해 하나씩 입력한다. 이때 긁어온 데이터들이 list 안에 들어있으므로 list를 입력해준다
        # 아울러, 우리가 가져오려는 값이 "company" : "full stack python devloper" 라고 되어있다 
        # 이때 key,value 중 value 만 가져오려면 ~~.value 이런식으로 코드를 적으면 된다.    
    return

最終実行


ナイフもpyに新しく作成したファイルを追加し、モジュールを追加してモジュール内の関数を指定すると終了します!!
from so import get_jobs as so_jobs
from indeed import get_jobs as indeed_jobs
from save import save_to_file

jobs = so_jobs() + indeed_jobs()
save_to_file(jobs)
では、csvファイルに次のデータが格納されていることがわかります.