기술나눔

Python 크롤러 원리와 3가지 작은 사례(소스 코드)

2024-07-11

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

1. 파충류 원리

웹 크롤러는 웹 콘텐츠를 자동으로 검색하는 데 사용되는 프로그램입니다. 사용자가 웹 페이지를 탐색하는 프로세스를 시뮬레이션하고, HTTP 요청을 전송하여 웹 페이지의 소스 코드를 얻고, 구문 분석 및 추출 기술을 사용하여 필요한 데이터를 얻습니다.

1. HTTP 요청 및 응답 프로세스

크롤러는 대상 웹사이트에 HTTP 요청을 보냅니다. 요청에는 URL, 요청 방법(예: GET 또는 POST), 요청 헤더(Headers) 등이 포함됩니다. 서버는 요청을 받은 후 상태 코드, 응답 헤더 및 응답 본문(웹 페이지 콘텐츠)이 포함된 HTTP 응답을 반환합니다.

2. 일반적으로 사용되는 크롤러 기술

  • 요청 라이브러리:예를 들어requests그리고aiohttp, HTTP 요청을 보내는 데 사용됩니다.
  • 파싱 ​​라이브러리:예를 들어BeautifulSouplxml그리고PyQuery, 웹페이지 콘텐츠를 구문 분석하는 데 사용됩니다.
  • 저장소:예를 들어pandas그리고SQLite, 크롤링된 데이터를 저장하는 데 사용됩니다.
  • 비동기 라이브러리:예를 들어asyncio그리고aiohttp, 비동기 크롤러를 구현하고 크롤링 효율성을 향상시키는 데 사용됩니다.

2. Python 크롤러에 일반적으로 사용되는 라이브러리

1. 라이브러리 요청

  • 요청: HTTP 연결 지속성 및 연결 풀링, SSL 인증서 확인, 쿠키 등을 지원하는 간단하고 강력한 HTTP 라이브러리입니다.
  • aiohttp: 높은 동시성 크롤러 시나리오에 적합한 asyncio 기반의 비동기 HTTP 라이브러리입니다.

2. 파싱 라이브러리

  • 뷰티풀수프: HTML 및 XML 구문 분석을 위한 라이브러리로, 사용하기 쉽고 여러 파서를 지원합니다.
  • 렉시멀: XPath 및 CSS 선택기를 지원하는 효율적인 XML 및 HTML 구문 분석 라이브러리입니다.
  • 파이쿼리(PyQuery): jQuery와 구문이 유사하고 사용하기 쉬운 Python 버전의 jQuery입니다.

3. 저장소

  • 팬더: 데이터 구조와 데이터 분석 도구를 제공하고 다양한 파일 형식을 지원하는 강력한 데이터 분석 라이브러리입니다.
  • SQLite: SQL 쿼리를 지원하고 소규모 크롤러 프로젝트에 적합한 경량 데이터베이스입니다.

다음으로 Python 크롤러의 기본 지식을 더 잘 배우고 이해하는 데 도움이 되도록 Python 크롤러의 7가지 작은 사례를 사용하겠습니다. 다음은 각 사례에 대한 소개 및 소스 코드입니다.

사례 1: 상위 250개 Douban 영화 크롤링

이 경우에는BeautifulSoup라이브러리는 상위 250개 Douban 영화에서 영화 제목, 평점, 리뷰어 수와 같은 정보를 크롤링하고 이 정보를 CSV 파일에 저장합니다.

  1. import requests
  2. from bs4 import BeautifulSoup
  3. import csv
  4. # 请求URL
  5. url = 'https://movie.douban.com/top250'
  6. # 请求头部
  7. headers = {
  8. 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36'
  9. }
  10. # 解析页面函数
  11. def parse_html(html):
  12. soup = BeautifulSoup(html, 'lxml')
  13. movie_list = soup.find('ol', class_='grid_view').find_all('li')
  14. for movie in movie_list:
  15. title = movie.find('div', class_='hd').find('span', class_='title').get_text()
  16. rating_num = movie.find('div', class_='star').find('span', class_='rating_num').get_text()
  17. comment_num = movie.find('div', class_='star').find_all('span')[-1].get_text()
  18. writer.writerow([title, rating_num, comment_num])
  19. # 保存数据函数
  20. def save_data():
  21. f = open('douban_movie_top250.csv', 'a', newline='', encoding='utf-8-sig')
  22. global writer
  23. writer = csv.writer(f)
  24. writer.writerow(['电影名称', '评分', '评价人数'])
  25. for i in range(10):
  26. url = 'https://movie.douban.com/top250?start=' str(i * 25) '