엔트리부터 폐기까지 3 개 데이터 모델링 및 요청

스크래피 데이터 모델링 및 요청

여기에 사진 설명 삽입

학습 목표 :
  1. 모델링을위한 스크래피 프로젝트에 적용
  2. 응용 프로그램은 Request 객체를 구성하고 요청을 보냅니다.
  3. 응용 프로그램은 메타 매개 변수를 사용하여 다른 분석 기능으로 데이터를 전달합니다.

1. 데이터 모델링

일반적으로 프로젝트를 수행하는 과정에서 items.py의 데이터 모델링

1.1 왜 모델인가

  1. 항목을 정의한다는 것은 수동 오류를 방지하기 위해 파악해야하는 필드를 미리 계획하는 것을 의미합니다. 정의 후에는 시스템이 운영 프로세스 중에 자동으로 확인하기 때문입니다.
  2. 주석과 함께 어떤 필드를 잡을지 명확하게 알 수 있습니다. 정의되지 않은 필드는 잡을 수 없습니다. 대상 필드가 적을 때 대신 사전을 사용할 수 있습니다.
  3. 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)

노트:

  1. myspider.items import MyspiderItem에서이 코드 줄은 항목의 올바른 가져 오기 경로에주의를 기울이고 pycharm으로 표시된 오류를 무시합니다.
  2. 파이썬에서 가져 오기 경로의 키 : 실행을 시작할 위치, 가져 오기 위치

1.4 개발 프로세스 요약

  1. 프로젝트

    스크래피 시작 프로젝트 프로젝트 이름 만들기


  2. items.py 파일의 명확한 목표 모델
  3. 크롤러

    생성 3.1 크롤러

    스크래피 genspider 생성 크롤러 이름의 허용 가능한 도메인
    3.2 크롤러 완료

    start_urls를
    수정하여 allowed_domains를 확인하고 수정
    하여 메소드 작성 및 분석
  4. 데이터 저장

    pipelines.py

    파일 에서 데이터 처리를위한 파이프 라인 정의 settings.py 파일에서 파이프 라인 등록 및 활성화

2. 페이지 넘기기 요청 아이디어

다음 그림의 모든 페이지에서 데이터를 추출하려면 어떻게해야합니까?

요청 모듈이 페이지 넘기기 요청을 구현하는 방법을 상기하십시오.

  1. 다음 페이지의 URL 주소 찾기
  2. requests.get (url) 호출

페이지 넘기기를 실현하기위한 스크래피의 아이디어 :

  1. 다음 페이지의 URL 주소 찾기
  2. URL 주소의 요청 객체를 구성하고 엔진에 전달합니다.

3. Request 객체를 생성하고 요청을 보냅니다.

3.1 구현 방법

  1. URL 주소 결정
  2. 요청 생성, scrapy.Request (url, callback)
    • 콜백 : 요청에서 반환 된 응답을 구문 분석하는 데 사용되는 함수를 나타내는 구문 분석 함수의 이름을 지정합니다.
  3. 엔진에 요청을 보냅니다. yield scrapy.Request (url, callback)

3.2 Netease 모집 크롤러

Netease의 모집 페이지에서 모집 정보를 크롤링하여 페이지 넘기기 요청을 구현하는 방법을 알아보십시오.

주소 : https://hr.163.com/position/list.do

사고 분석 :
  1. 홈페이지 데이터 가져 오기
  2. 다음 페이지의 주소를 찾고, 페이지를 넘기고, 데이터를 가져옵니다.
노트:
  1. ROBOTS 프로토콜은 설정에서 설정할 수 있습니다.
# False表示忽略网站的robots.txt协议,默认为True
ROBOTSTXT_OBEY = False
  1. 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])
매개 변수 설명
  1. 괄호 안의 매개 변수는 선택적 매개 변수입니다.
  2. callback : 현재 URL의 응답을 처리 할 함수를 나타냅니다.
  3. meta : 다양한 분석 기능으로 데이터 전송을 실현합니다. Meta는 기본적으로 다운로드 지연, 요청 깊이 등 일부 데이터를 제공합니다.
  4. dont_filter : 기본값은 False이며 요청 된 URL 주소를 필터링합니다. 즉, 요청 된 URL 주소는 계속 요청되지 않으며, 게시물 표시 줄의 페이지 넘기기 요청, 페이지의 총 데이터와 같이 반복적으로 요청해야하는 URL 주소에 대해 True로 설정할 수 있습니다. 변경 중입니다. start_urls의 주소가 반복적으로 요청됩니다. 그렇지 않으면 프로그램이 시작되지 않습니다.
  5. 방법 : POST 또는 GET 요청 지정
  6. 헤더 : 쿠키를 포함하지 않는 사전 수신
  7. 쿠키 : 사전을 받고 특별히 쿠키를 배치합니다.
  8. 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"]
주의
  1. 메타 매개 변수는 사전입니다.
  2. proxy프록시 IP를 나타내는 메타 사전에는 고정 키가 있습니다 . 스크래피 다운로드 미들웨어 학습에 프록시 IP 사용을 소개합니다.

요약

  1. Item 데이터 클래스를 개선하고 사용합니다.
  2. items.py에서 크롤링 할 필드를 완료하십시오.
  3. 먼저 크롤러 파일에서 항목 가져 오기
  4. Item 객체를 만든 후 사전처럼 직접 사용
  5. Request 객체를 생성하고 요청을 보냅니다.
  6. scrapy.Request 클래스 가져 오기
  7. 구문 분석 기능에서 URL 추출
  8. yield scrapy.Request (url, callback = self.parse_detail, meta = {})
  9. 메타 매개 변수를 사용하여 다양한 분석 기능에서 데이터를 전달합니다.
  10. 이전 구문 분석 함수를 통해 메타를 전달하십시오. yield scrapy.Request (url, callback = self.xxx, meta = ())
  11. 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()

끝입니다. 도움이된다면 좋아요와 팔로우를 환영합니다. 좋아요는 저에게 매우 중요합니다.

추천

출처blog.csdn.net/qq_45176548/article/details/111991181