스크래피 데이터 모델링 및 요청
학습 목표 :
- 모델링을위한 스크래피 프로젝트에 적용
- 응용 프로그램은 Request 객체를 구성하고 요청을 보냅니다.
- 응용 프로그램은 메타 매개 변수를 사용하여 다른 분석 기능으로 데이터를 전달합니다.
1. 데이터 모델링
일반적으로 프로젝트를 수행하는 과정에서 items.py의 데이터 모델링
1.1 왜 모델인가
- 항목을 정의한다는 것은 수동 오류를 방지하기 위해 파악해야하는 필드를 미리 계획하는 것을 의미합니다. 정의 후에는 시스템이 운영 프로세스 중에 자동으로 확인하기 때문입니다.
- 주석과 함께 어떤 필드를 잡을지 명확하게 알 수 있습니다. 정의되지 않은 필드는 잡을 수 없습니다. 대상 필드가 적을 때 대신 사전을 사용할 수 있습니다.
- Scrapy의 ImagesPipeline 파이프 라인 클래스와 같이 Scrapy의 일부 특정 구성 요소는 Item에서 지원해야합니다. Baidu에서 자세한 내용을 검색하십시오.
1.2 모델링 방법
items.py 파일에서 추출 할 필드를 정의하십시오.
class MyspiderItem(scrapy.Item):
name = scrapy.Field() # 讲师的名字
title = scrapy.Field() # 讲师的职称
desc = scrapy.Field() # 讲师的介绍
1.3 템플릿 클래스 사용 방법
템플릿 클래스 정의는 나중에 크롤러에서 가져 와서 인스턴스화해야하며 후속 사용 방법은 사전을 사용하는 것과 동일합니다.
job.py :
from myspider.items import MyspiderItem # 导入Item,注意路径
...
def parse(self, response)
item = MyspiderItem() # 实例化后可直接使用
item['name'] = node.xpath('./h3/text()').extract_first()
item['title'] = node.xpath('./h4/text()').extract_first()
item['desc'] = node.xpath('./p/text()').extract_first()
print(item)
노트:
- myspider.items import MyspiderItem에서이 코드 줄은 항목의 올바른 가져 오기 경로에주의를 기울이고 pycharm으로 표시된 오류를 무시합니다.
- 파이썬에서 가져 오기 경로의 키 : 실행을 시작할 위치, 가져 오기 위치
1.4 개발 프로세스 요약
- 프로젝트
스크래피 시작 프로젝트 프로젝트 이름 만들기
items.py 파일의 명확한 목표 모델- 크롤러
생성 3.1 크롤러
스크래피 genspider 생성 크롤러 이름의 허용 가능한 도메인
3.2 크롤러 완료
start_urls를
수정하여 allowed_domains를 확인하고 수정
하여 메소드 작성 및 분석 - 데이터 저장
pipelines.py
파일 에서 데이터 처리를위한 파이프 라인 정의 settings.py 파일에서 파이프 라인 등록 및 활성화
2. 페이지 넘기기 요청 아이디어
다음 그림의 모든 페이지에서 데이터를 추출하려면 어떻게해야합니까?
![](./images/3.1.scrapy翻页.png)
요청 모듈이 페이지 넘기기 요청을 구현하는 방법을 상기하십시오.
- 다음 페이지의 URL 주소 찾기
- requests.get (url) 호출
페이지 넘기기를 실현하기위한 스크래피의 아이디어 :
- 다음 페이지의 URL 주소 찾기
- URL 주소의 요청 객체를 구성하고 엔진에 전달합니다.
3. Request 객체를 생성하고 요청을 보냅니다.
3.1 구현 방법
- URL 주소 결정
- 요청 생성, scrapy.Request (url, callback)
- 콜백 : 요청에서 반환 된 응답을 구문 분석하는 데 사용되는 함수를 나타내는 구문 분석 함수의 이름을 지정합니다.
- 엔진에 요청을 보냅니다. yield scrapy.Request (url, callback)
3.2 Netease 모집 크롤러
Netease의 모집 페이지에서 모집 정보를 크롤링하여 페이지 넘기기 요청을 구현하는 방법을 알아보십시오.
주소 : https://hr.163.com/position/list.do
사고 분석 :
- 홈페이지 데이터 가져 오기
- 다음 페이지의 주소를 찾고, 페이지를 넘기고, 데이터를 가져옵니다.
노트:
- ROBOTS 프로토콜은 설정에서 설정할 수 있습니다.
# False表示忽略网站的robots.txt协议,默认为True
ROBOTSTXT_OBEY = False
- User-Agent는 설정에서 설정할 수 있습니다.
# scrapy发送的每一个请求的默认UA都是设置的这个User-Agent
USER_AGENT = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36'
3.3 코드 구현
크롤러 파일의 구문 분석 방법에서 :
......
# 提取下一页的href
next_url = response.xpath('//a[contains(text(),">")]/@href').extract_first()
# 判断是否是最后一页
if next_url != 'javascript:void(0)':
# 构造完整url
url = 'https://hr.163.com/position/list.do' + next_url
# 构造scrapy.Request对象,并yield给引擎
# 利用callback参数指定该Request对象之后获取的响应用哪个函数进行解析
yield scrapy.Request(url, callback=self.parse)
......
3.4 scrapy.Request의 추가 매개 변수
scrapy.Request(url[,callback,method="GET",headers,body,cookies,meta,dont_filter=False])
매개 변수 설명
- 괄호 안의 매개 변수는 선택적 매개 변수입니다.
- callback : 현재 URL의 응답을 처리 할 함수를 나타냅니다.
- meta : 다양한 분석 기능으로 데이터 전송을 실현합니다. Meta는 기본적으로 다운로드 지연, 요청 깊이 등 일부 데이터를 제공합니다.
- dont_filter : 기본값은 False이며 요청 된 URL 주소를 필터링합니다. 즉, 요청 된 URL 주소는 계속 요청되지 않으며, 게시물 표시 줄의 페이지 넘기기 요청, 페이지의 총 데이터와 같이 반복적으로 요청해야하는 URL 주소에 대해 True로 설정할 수 있습니다. 변경 중입니다. start_urls의 주소가 반복적으로 요청됩니다. 그렇지 않으면 프로그램이 시작되지 않습니다.
- 방법 : POST 또는 GET 요청 지정
- 헤더 : 쿠키를 포함하지 않는 사전 수신
- 쿠키 : 사전을 받고 특별히 쿠키를 배치합니다.
- body : json 문자열, POST 데이터 수신, payload_post 요청 전송시 사용 (post request는 다음 장에서 소개)
4. 메타 매개 변수 사용
메타의 역할 : 메타는 다양한 분석 기능에서 데이터 전송을 실현할 수 있습니다.
크롤러 파일의 구문 분석 메소드에서 추출 세부 사항 페이지가 추가되기 전에 콜백에 의해 지정된 parse_detail 함수 :
def parse(self,response):
...
yield scrapy.Request(detail_url, callback=self.parse_detail,meta={"item":item})
...
def parse_detail(self,response):
#获取之前传入的item
item = resposne.meta["item"]
주의
- 메타 매개 변수는 사전입니다.
proxy
프록시 IP를 나타내는 메타 사전에는 고정 키가 있습니다 . 스크래피 다운로드 미들웨어 학습에 프록시 IP 사용을 소개합니다.
요약
- Item 데이터 클래스를 개선하고 사용합니다.
- items.py에서 크롤링 할 필드를 완료하십시오.
- 먼저 크롤러 파일에서 항목 가져 오기
- Item 객체를 만든 후 사전처럼 직접 사용
- Request 객체를 생성하고 요청을 보냅니다.
- scrapy.Request 클래스 가져 오기
- 구문 분석 기능에서 URL 추출
- yield scrapy.Request (url, callback = self.parse_detail, meta = {})
- 메타 매개 변수를 사용하여 다양한 분석 기능에서 데이터를 전달합니다.
- 이전 구문 분석 함수를 통해 메타를 전달하십시오. yield scrapy.Request (url, callback = self.xxx, meta = ())
- self.xxx 함수에서 response.meta.get ( 'key', '') 또는 response.meta [ 'key']는 전달 된 데이터를 검색하는 데 사용됩니다.
참조 코드
wangyi / spiders / job.py
import scrapy
class JobSpider(scrapy.Spider):
name = 'job'
# 2.检查允许的域名
allowed_domains = ['163.com']
# 1 设置起始的url
start_urls = ['https://hr.163.com/position/list.do']
def parse(self, response):
# 获取所有的职位节点列表
node_list = response.xpath('//*[@class="position-tb"]/tbody/tr')
# print(len(node_list))
# 遍历所有的职位节点列表
for num, node in enumerate(node_list):
# 索引为值除2取余为0的才是含有数据的节点,通过判断进行筛选
if num % 2 == 0:
item = {}
item['name'] = node.xpath('./td[1]/a/text()').extract_first()
item['link'] = node.xpath('./td[1]/a/@href').extract_first()
item['depart'] = node.xpath('./td[2]/text()').extract_first()
item['category'] = node.xpath('./td[3]/text()').extract_first()
item['type'] = node.xpath('./td[4]/text()').extract_first()
item['address'] = node.xpath('./td[5]/text()').extract_first()
item['num'] = node.xpath('./td[6]/text()').extract_first().strip()
item['date'] = node.xpath('./td[7]/text()').extract_first()
yield item
# 翻页处理
# 获取翻页url
part_url = response.xpath('//a[contains(text(),">")]/@href').extract_first()
# 判断是否为最后一页,如果不是最后一页则进行翻页操作
if part_url != 'javascript:void(0)':
# 拼接完整翻页url
next_url = 'https://hr.163.com/position/list.do' + part_url
yield scrapy.Request(
url=next_url,
callback=self.parse
)
wangyi / items.py
class WangyiItem(scrapy.Item):
# define the fields for your item here like:
name = scrapy.Field()
link = scrapy.Field()
depart = scrapy.Field()
category = scrapy.Field()
type = scrapy.Field()
address = scrapy.Field()
num = scrapy.Field()
date = scrapy.Field()
끝입니다. 도움이된다면 좋아요와 팔로우를 환영합니다. 좋아요는 저에게 매우 중요합니다.