Python 캡 처 프레임 워 크 Scrapy 파충류 입문:페이지 추출
13963 단어 python파충류 프레임 scrapy페이지 추출
Scrapy 는 상 자 를 열 수 있 는 기본 구성 을 제공 할 뿐만 아니 라 자신의 수요 에 따라 강력 한 사용자 정의 도 할 수 있 는 아주 좋 은 캡 처 프레임 워 크 입 니 다.본 고 는 주로 Python 캡 처 프레임 워 크 Scrapy 의 페이지 추출 에 관 한 내용 을 소개 하고 참고 학습 을 제공 합 니 다.다음은 편집장 에 따라 함께 공부 하 겠 습 니 다.
시작 하기 전에 scrapy 프레임 워 크 의 입문 에 대해 서 는 이 글 을 참고 하 실 수 있 습 니 다.https://www.jb51.net/article/87820.htm
그림 벌레 망 을 예 로 들 어 그림 을 캡 처 하 는 파충류 프로젝트 를 만 듭 니 다.
내용 분석
도 충 망을 열 면 상단 메뉴 인'발견','라벨'안 에는 각종 그림 에 대한 분류 가 있 습 니 다.예 를 들 어'미녀'를 클릭 하면 홈 페이지 의 링크 는 다음 과 같 습 니 다.https://tuchong.com/tags/미녀우 리 는 이 를 파충류 의 입구 로 삼 아 이 페이지 를 분석 합 니 다.
페이지 를 열 면 그림 집합 이 하나씩 나타 납 니 다.그림 집합 을 클릭 하면 전체 화면 으로 그림 을 조회 할 수 있 습 니 다.아래로 스크롤 하면 더 많은 그림 집합 이 나타 납 니 다.페이지 넘 기기 설정 이 없습니다.Chrome 오른쪽 단 추 를 누 르 면"요소 검사"개발 자 도 구 를 열 고 페이지 원본 코드 를 검사 합 니 다.내용 부분 은 다음 과 같 습 니 다.
<div class="content">
<div class="widget-gallery">
<ul class="pagelist-wrapper">
<li class="gallery-item...
모든 li.gallery-item 은 그림 집의 입구 로 판단 할 수 있 습 니 다.ul.pagelist-wrapper 에 저 장 됩 니 다.div.widget-gallery 는 용기 입 니 다.xpath 를 사용 하여 선택 하면/div[@class="widget-gallery"]/ul/li 이 어야 합 니 다.일반 페이지 의 논리 에 따라 li.gallery-item 아래 에 해당 하 는 링크 주 소 를 찾 아 다음 페이지 로 깊이 들 어가 그림 을 캡 처 합 니 다.그러나 Postman 과 유사 한 HTTP 디 버 깅 도구 로 이 페이지 를 요청 하면 다음 과 같은 내용 을 얻 을 수 있 습 니 다.
<div class="content">
<div class="widget-gallery"></div>
</div>
즉,실제 그림 집합 내용 이 없 기 때문에 페이지 가 Ajax 요청 을 사용 했다 고 단정 할 수 있 습 니 다.브 라 우 저 에서 페이지 를 불 러 올 때 만 그림 집합 내용 을 요청 하고 div.widget-gallery 에 가입 할 수 있 습 니 다.개발 자 도 구 를 통 해 XHR 요청 주 소 를 볼 수 있 습 니 다.
https://tuchong.com/rest/tags/ /posts?page=1&count=20&order=weekly&before_timestamp=
매개 변 수 는 간단 합 니 다.page 는 페이지 번호 이 고 count 는 각 페이지 의 그림 집합 수량 입 니 다.order 는 정렬 입 니 다.beforetimestamp 는 비어 있 고,도 충 은 콘 텐 츠 를 푸 시 하 는 사이트 이기 때문에 beforetimestamp 는 시간 값 이 어야 합 니 다.시간 에 따라 다른 내용 을 표시 합 니 다.시간 을 고려 하지 않 고 최신 페이지 에서 직접 캡 처 합 니 다.요청 결 과 는 JSON 형식 으로 캡 처 난이 도 를 낮 추 었 습 니 다.결 과 는 다음 과 같 습 니 다.
{
"postList": [
{
"post_id": "15624611",
"type": "multi-photo",
"url": "https://weishexi.tuchong.com/15624611/",
"site_id": "443122",
"author_id": "443122",
"published_at": "2017-10-28 18:01:03",
"excerpt": "10 18 ",
"favorites": 4052,
"comments": 353,
"rewardable": true,
"parent_comments": "165",
"rewards": "2",
"views": 52709,
"title": " ",
"image_count": 15,
"images": [
{
"img_id": 11585752,
"user_id": 443122,
"title": "",
"excerpt": "",
"width": 5016,
"height": 3840
},
{
"img_id": 11585737,
"user_id": 443122,
"title": "",
"excerpt": "",
"width": 3840,
"height": 5760
},
...
],
"title_image": null,
"tags": [
{
"tag_id": 131,
"type": "subject",
"tag_name": " ",
"event_type": "",
"vote": ""
},
{
"tag_id": 564,
"type": "subject",
"tag_name": " ",
"event_type": "",
"vote": ""
}
],
"favorite_list_prefix": [],
"reward_list_prefix": [],
"comment_list_prefix": [],
"cover_image_src": "https://photo.tuchong.com/443122/g/11585752.webp",
"is_favorite": false
}
],
"siteList": {...},
"following": false,
"coverUrl": "https://photo.tuchong.com/443122/ft640/11585752.webp",
"tag_name": " ",
"tag_id": "564",
"url": "https://tuchong.com/tags/%E7%BE%8E%E5%A5%B3/",
"more": true,
"result": "SUCCESS"
}
속성 이름 에 따라 대응 하 는 내용 의 의 미 를 쉽게 알 수 있 습 니 다.여기 서 우 리 는 post list 라 는 속성 에 만 관심 을 가 져 야 합 니 다.이에 대응 하 는 배열 요 소 는 바로 그림 집합 입 니 다.그림 집합 요소 중 몇 가지 속성 이 있 습 니 다.우 리 는 사용 해 야 합 니 다.2.프로젝트 생 성
상기 절 차 를 거 쳐 프로젝트 는 자동 으로 일부 파일 과 설정 을 만 들 었 고 디 렉 터 리 구 조 는 다음 과 같다.
(PROJECT)
│ scrapy.cfg
│
└─tuchong
│ items.py
│ middlewares.py
│ pipelines.py
│ settings.py
│ __init__.py
│
├─spiders
│ │ photo.py
│ │ __init__.py
│ │
│ └─__pycache__
│ __init__.cpython-36.pyc
│
└─__pycache__
settings.cpython-36.pyc
__init__.cpython-36.pyc
items.py 에서 Tuchong Item 클래스 를 만 들 고 필요 한 속성 을 정의 합 니 다.속성 은 scrapy.Field 값 으로 문자,숫자 또는 목록 또는 사전 등 을 계승 할 수 있 습 니 다.
import scrapy
class TuchongItem(scrapy.Item):
post_id = scrapy.Field()
site_id = scrapy.Field()
title = scrapy.Field()
type = scrapy.Field()
url = scrapy.Field()
image_count = scrapy.Field()
images = scrapy.Field()
tags = scrapy.Field()
excerpt = scrapy.Field()
...
이 속성의 값 은 파충류 주체 에 부 여 됩 니 다.spiders\photo.py 이 파일 은 명령 scrapy genspider photo tuchong.com 을 통 해 자동 으로 만 들 어 졌 습 니 다.초기 내용 은 다음 과 같 습 니 다.
import scrapy
class PhotoSpider(scrapy.Spider):
name = 'photo'
allowed_domains = ['tuchong.com']
start_urls = ['http://tuchong.com/']
def parse(self, response):
pass
파충류 이름 name,허 용 된 도 메 인 이름 alloweddomains(링크 가 이 도 메 인 이름 에 속 하지 않 으 면 버 리 고 여러 개 허용),시작 주소 starturls 에서 정 의 된 주소 캡 처(여러 개 허용)함수 parse 는 요청 내용 을 처리 하 는 기본 리 셋 함수 입 니 다.매개 변수 response 는 요청 내용 입 니 다.페이지 내용 텍스트 는 response.body 에 저장 되 어 있 습 니 다.기본 코드 를 약간 수정 하여 다 중 페이지 순환 전송 요청 을 만족 시 켜 야 합 니 다.start 를 다시 불 러 와 야 합 니 다.requests 함수,순환 문 구 를 통 해 여러 페이지 의 링크 요청 을 구축 합 니 다.수정 후 코드 는 다음 과 같 습 니 다.
import scrapy, json
from ..items import TuchongItem
class PhotoSpider(scrapy.Spider):
name = 'photo'
# allowed_domains = ['tuchong.com']
# start_urls = ['http://tuchong.com/']
def start_requests(self):
url = 'https://tuchong.com/rest/tags/%s/posts?page=%d&count=20&order=weekly';
# 10 , 20
# parse Requests
for page in range(1, 11):
yield scrapy.Request(url=url % (' ', page), callback=self.parse)
# , TuchongItem
def parse(self, response):
body = json.loads(response.body_as_unicode())
items = []
for post in body['postList']:
item = TuchongItem()
item['type'] = post['type']
item['post_id'] = post['post_id']
item['site_id'] = post['site_id']
item['title'] = post['title']
item['url'] = post['url']
item['excerpt'] = post['excerpt']
item['image_count'] = int(post['image_count'])
item['images'] = {}
# images {img_id: img_url}
for img in post.get('images', ''):
img_id = img['img_id']
url = 'https://photo.tuchong.com/%s/f/%s.jpg' % (item['site_id'], img_id)
item['images'][img_id] = url
item['tags'] = []
# tags tag_name
for tag in post.get('tags', ''):
item['tags'].append(tag['tag_name'])
items.append(item)
return items
이러한 절 차 를 거 쳐 캡 처 한 데 이 터 는 Tuchong Item 류 에 저장 되 어 구조 화 된 데이터 로 처리 하고 저장 할 수 있 습 니 다.앞에서 말 했 듯 이 모든 캡 처 항목 이 필요 한 것 은 아 닙 니 다.예 를 들 어 이 예 에서 우 리 는 type="multi"만 필요 합 니 다.photo 형식의 그림 집합,그리고 그림 이 너무 적은 것 도 필요 하지 않 습 니 다.이 캡 처 항목 의 선별 작업 과 pipelines.py 에 저장 하 는 방법 은 pipelines.py 에서 처리 해 야 합 니 다.이 파일 은 기본적으로 클래스 TuchongPipeline 을 만 들 고 process 를 다시 불 러 왔 습 니 다.item 함수,이 함수 수정 을 통 해 조건 에 맞 는 item 만 되 돌려 줍 니 다.코드 는 다음 과 같 습 니 다.
...
def process_item(self, item, spider):
# scrapy.exceptions.DropItem ,
if int(item['image_count']) < 3:
raise DropItem(" : " + item['url'])
elif item['type'] != 'multi-photo':
raise DropItem(" : " + + item['url'])
else:
print(item['url'])
return item
...
물론 파 이 프 를 사용 하지 않 고 parse 에서 직접 처리 하 는 것 도 마찬가지 입 니 다.다만 이러한 구조 가 더욱 뚜렷 하고 기능 이 더 많은 FilePipelines 와 ImagePipelines 가 사용 할 수 있 습 니 다.process아 이 템 은 각 항목 을 캡 처 한 후 터치 하 며 오픈 도 있 습 니 다.spider 및 closespider 함 수 는 파충류 가 열 리 고 닫 힐 때의 동작 을 처리 할 수 있 습 니 다.메모:파 이 프 는 항목 에 등록 해 야 사용 할 수 있 습 니 다.settings.py 에 추가 합 니 다:
ITEM_PIPELINES = {
'tuchong.pipelines.TuchongPipeline': 300, # : ( )
}
또한 대부분의 사이트 에는 파충류 에 반대 하 는 Robots.txt 배제 프로 토 콜 이 있 고 ROBOTSTXT 를 설치한다.OBEY=True 는 이러한 협 의 를 무시 할 수 있 습 니 다.예,이것 은 단지 군자 협정 인 것 같 습 니 다.만약 에 사이트 에 브 라 우 저 User Agent 나 IP 주소 검 측 을 설정 하여 파충 류 를 반대 한다 면 더욱 고 급 스 러 운 Scrapy 기능 이 필요 합 니 다.본 고 는 설명 하지 않 습 니 다.운행
cmder 명령 행 을 되 돌려 프로젝트 디 렉 터 리 에 들 어가 명령 을 입력 하 십시오:
scrapy crawl photo
터미널 에 서 는 모든 파행 결과 와 디 버 깅 정 보 를 출력 하고 마지막 에 파충류 가 운행 하 는 통계 정 보 를 보 여 줍 니 다.예 를 들 어:
[scrapy.statscollectors] INFO: Dumping Scrapy stats:
{'downloader/request_bytes': 491,
'downloader/request_count': 2,
'downloader/request_method_count/GET': 2,
'downloader/response_bytes': 10224,
'downloader/response_count': 2,
'downloader/response_status_count/200': 2,
'finish_reason': 'finished',
'finish_time': datetime.datetime(2017, 11, 27, 7, 20, 24, 414201),
'item_dropped_count': 5,
'item_dropped_reasons_count/DropItem': 5,
'item_scraped_count': 15,
'log_count/DEBUG': 18,
'log_count/INFO': 8,
'log_count/WARNING': 5,
'response_received_count': 2,
'scheduler/dequeued': 1,
'scheduler/dequeued/memory': 1,
'scheduler/enqueued': 1,
'scheduler/enqueued/memory': 1,
'start_time': datetime.datetime(2017, 11, 27, 7, 20, 23, 867300)}
주로 ERROR 및 WARNING 두 가 지 를 주목 하 는데 이곳 의 Warning 은 사실 조건 에 맞지 않 아 발생 하 는 DropItem 이상 입 니 다.5.결과 저장
대부분의 경우 캡 처 한 결 과 를 저장 해 야 합 니 다.기본적으로 item.py 에서 정의 하 는 속성 은 파일 에 저장 할 수 있 습 니 다.명령 행 에 인자-o{filename}만 추가 하면 됩 니 다.
scrapy crawl photo -o output.json # JSON
scrapy crawl photo -o output.csv # CSV
메모:파일 에 출력 되 는 항목 은 TuchongPipeline 을 거치 지 않 은 항목 입 니 다.parse 함수 에서 되 돌아 오 는 Item 만 출력 되 므 로 parse 에서 필요 한 항목 만 걸 러 낼 수 있 습 니 다.데이터베이스 에 저장 하려 면 추가 코드 처 리 를 추가 해 야 합 니 다.예 를 들 어 pipelines.py 에서 processitem 후 추가:
...
def process_item(self, item, spider):
...
else:
print(item['url'])
self.myblog.add_post(item) # myblog ,
return item
...
데이터베이스 삽입 작업 에서 중복 되 는 내용 을 제거 하기 위해 item[post 를 사용 할 수 있 습 니 다.id']판단 하고 존재 하면 건 너 뛰 기.이 항목 의 캡 처 내용 은 텍스트 와 이미지 링크 만 언급 되 고 이미지 파일 을 다운로드 하지 않 았 습 니 다.그림 을 다운로드 하려 면 두 가지 방식 으로 할 수 있 습 니 다.
Requests 모듈 설치,processitem 함수 에서 그림 내용 을 다운로드 하고 데이터 베 이 스 를 저장 할 때 로 컬 그림 경로 로 바 꿉 니 다.
ImagePipelines 파 이 프 를 이용 하여 그림 을 다운로드 하고 구체 적 인 사용 방법 은 다음 에 설명 하 겠 습 니 다.
총결산
이상 은 이 글 의 전체 내용 입 니 다.본 논문 의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 참고 학습 가치 가 있 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 댓 글 을 남 겨 주 셔 서 저희 에 대한 지지 에 감 사 드 립 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
로마 숫자를 정수로 또는 그 반대로 변환그 중 하나는 로마 숫자를 정수로 변환하는 함수를 만드는 것이었고 두 번째는 그 반대를 수행하는 함수를 만드는 것이었습니다. 문자만 포함합니다'I', 'V', 'X', 'L', 'C', 'D', 'M' ; 문자열이 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.