크롤러(웹 스크래핑)은 프로그래밍을 통해 인터넷에서 자동으로 정보를 얻는 프로세스를 말합니다. 크롤러의 목적은 일반적으로 데이터 분석, 처리 또는 표시를 위해 웹 페이지에서 데이터를 크롤링하는 것입니다. 다음은 크롤러의 기본 프로세스와 몇 가지 중요한 개념입니다.
크롤러의 기본 프로세스:
목표를 결정하다: 크롤링할 웹사이트나 페이지를 결정합니다.
요청 보내기: 프로그래밍 언어(예: Python)를 사용하여 HTTP 요청을 보내고 웹 페이지 콘텐츠를 얻습니다.
구문 분석 페이지: 획득한 페이지를 구문 분석하여 필요한 정보를 추출합니다.
데이터 저장: 추출된 정보를 로컬 파일, 데이터베이스 또는 기타 데이터 저장 방법에 저장합니다.
정기 갱신: 정기적으로 정보를 얻어야 하는 경우 예약된 크롤러를 설정할 수 있습니다.
크롤러의 몇 가지 중요한 개념:
사용자 에이전트: 크롤러를 식별하는 데 사용되는 요청 헤더의 일부입니다. 일부 웹사이트에서는 User-Agent를 감지하며, 크롤러가 감지되면 접근이 제한될 수 있습니다.
쿠키: 사용자를 식별하기 위해 웹사이트가 사용자에게 로컬로 저장한 데이터입니다. 크롤러에서는 사용자 로그인 상태를 시뮬레이션하기 위해 쿠키가 필요한 경우가 있습니다.
HTTP 요청: 통신에 HTTP 프로토콜을 사용하고 GET 또는 POST 요청을 통해 웹 페이지 콘텐츠를 가져옵니다.
HTML 파싱: 구문 분석 라이브러리(예: BeautifulSoup, lxml 등)를 사용하여 HTML을 구문 분석하고 필요한 정보를 추출합니다.
XPath 및 CSS 선택기: 정보를 더 쉽게 추출할 수 있도록 HTML에서 요소를 찾는 구문입니다.
로봇.txt: 크롤러가 액세스할 수 있는 페이지와 액세스할 수 없는 페이지를 지정하는 표준입니다.
크롤러 방지: 일부 웹사이트는 요청 빈도 제한, 확인 코드, 동적 로딩 등과 같은 크롤러 방지 전략을 채택합니다. 크롤러는 이에 따라 이러한 상황을 처리해야 합니다.
연기: IP가 차단되는 것을 방지하기 위해 프록시 서버를 통해 요청을 보냅니다.
데이터 저장고저장소: 크롤링된 데이터를 로컬 파일이나 데이터베이스에 저장합니다.
크롤러 기술은 데이터 수집, 검색 엔진, 여론 모니터링 및 기타 분야에서 널리 사용되지만 크롤러를 사용할 때는 법률, 규정 및 웹 사이트 사용 규정을 준수해야 하며 개인 정보 보호 및 저작권을 존중해야 합니다.
예:
import os
import urllib.request
from urllib.parse import quote
import re
import urllib.error
import requests
import time
# 设置请求头获取Cookie
get_cookie_headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
"Chrome/92.0.4515.159 Safari/537.36 "}
get_cookie_html = "https://www.baidu.com/?tn=49055317_4_hao_pg"
get_cookie_target = requests.session()
cookie_target = get_cookie_target.get(get_cookie_html, headers=get_cookie_headers)
cookie = requests.utils.dict_from_cookiejar(cookie_target.cookies)
print(cookie)
key = []
value = []
result_cookie = ""
# 将Cookie转化为字符串形式
for i in cookie.keys():
key.append(i)
for i in cookie.values():
value.append(i)
for i in range(len(key)):
result_cookie += key[i] + '=' + value[i] + ";"
print(result_cookie)
# 设置请求头
myheaders = {
"Cookie": result_cookie,
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
"Chrome/92.0.4515.159 Safari/537.36 "
}
# 输入爬取的主题
pic_dir_name = input("输入想要爬取的主题:****")
# 设置保存路径
base_dir = r"E:\shezu\图/"
pic_dir = base_dir + pic_dir_name
# 创建文件夹
if os.path.exists(base_dir):
if os.path.exists(pic_dir):
print(pic_dir + " 文件已存在")
else:
os.mkdir(pic_dir)
else:
os.mkdir(base_dir)
os.mkdir(pic_dir)
# 对主题进行URL编码
keyword = quote(pic_dir_name, encoding='utf-8')
start_number = 0
base_url = "https://image.baidu.com/search/acjson?tn=resultjson_com&ipn=rj&queryWord=" + keyword + "&word=" + keyword + "&pn%d=&rn=60" % start_number
# 正则表达式预编译
key = r'thumbURL":"(.*?)"'
pic_url = re.compile(key)
number = 1
# 爬取图片
while start_number < 1800:
response = urllib.request.Request(base_url, headers=myheaders)
result = urllib.request.urlopen(response).read().decode("utf-8")
for i in re.findall(pic_url, result):
print(i)
try:
response = urllib.request.Request(i, headers=myheaders)
pic_result = urllib.request.urlopen(response).read()
with open(pic_dir + "/" + pic_dir_name + str(number) + ".jpg", "wb+") as f:
f.write(pic_result)
number += 1
time.sleep(0.5)
except urllib.error.URLError:
print("下载失败")
start_number += 60
이 스크립트의 원칙은 다음과 같습니다.
- Baidu 이미지 검색 페이지의 쿠키를 받으세요.
- Baidu 이미지 검색 URL을 구성하고 요청 헤더에 쿠키를 설정합니다.
- 반환된 JSON 데이터를 구문 분석하고 이미지의 URL을 추출합니다.
- 획득한 이미지 URL을 사용하여 지정된 디렉터리에 이미지를 다운로드합니다.
웹사이트 콘텐츠를 크롤링하려면 웹사이트의 관련 규정을 준수하고 이미지 저작권을 존중해야 합니다.