>

Scrapy Spider가 웹 사이트 형식 이상 치를 충족하면 작동이 중지됩니다. 잘못된 웹 사이트 요소는 다음과 같습니다 (강조 표시된 부분).

올바른 것은 'a'속성입니다. 아래처럼 보입니다 ((강조 표시된 부분)).

그리고 여기 내 거미가 있습니다 :

import scrapy
from scrapy.crawler import CrawlerProcess
class MySpider(scrapy.Spider):
  name = "name"
  allowed_domains = ["website domain"]
  start_urls = ['Mywebsite link']
  def parse(self, response):
    self.log('I just visited: ' + response.url)
    for i in response.css('tr.odd'):
        item = {
            'company_name': i.css('td > a::text')[0].extract(),
            'ABN': i.css('td > a::text')[1].extract(),
            'status': i.css('td::text')[2].extract(),
            'size': i.css('td::text')[3].extract(),
            'suburb/town': i.css('td::text')[4].extract(),
            'state': i.css('td::text')[5].extract(),
        }
        yield item
    for i in response.css('tr.even'):
        item = {
            'company_name': i.css('td > a::text')[0].extract(),
            **'ABN': i.css('td > a::text')[1].extract()**,     # this part stops working
            'status': i.css('td::text')[2].extract(),
            'size': i.css('td::text')[3].extract(),
            'suburb/town': i.css('td::text')[4].extract(),
            'state': i.css('td::text')[5].extract(),
        }
        yield item
    # follow pagination link
    next_page_url = response.css('li.next > a::attr(href)').extract_first()
    if next_page_url:
        next_page_url = response.urljoin(next_page_url)
        yield scrapy.Request(url=next_page_url, callback=self.parse)


웹 사이트에서 다음과 같이 보입니다. 해당 행의 '정보를 사용할 수 없음'부분은 스파이더를 중지시킵니다. 어떻게해야하는지 보여주세요. 감사합니다!

  • 답변 # 1

    한 번에 하나의 문제에 집중합시다 :

    값을 출력하도록 지시하는 대신 임시 변수를 사용하십시오.

       for i in response.css('tr.even'):
            abn = i.css('td > a::text')[1].extract()
            if not abn:
                abn = 'Unavailable' # Alternatively, you can use a fallback selector
            item = {
                'company_name': i.css('td > a::text')[0].extract(),
                'ABN': abn,
                #...
            }
            yield item
    
    

    당신은 또한 사용을 확인 할 수 있습니다 extract()extract_first() . 문서는 실제로 최신 사용법을 권장합니다. get()getall() 덜 혼란 스럽기 때문에.

    Scrapy usage docs are now written using .get() and .getall() methods. We feel that these new methods result in a more concise and readable code.

  • 답변 # 2

    구현의 주요 문제는 프로그램이 extract 존재하지 않는 요소에 대한 메소드.

    for row in response.css('table.views-table tbody tr'):
        i = {}
        # field specific selectors
        i['company_name'], i['ABN'], i['status'], i['size'], i['suburb/town'], i['state'] = row.css('td')
        for key in i.keys():
            i[key] = i[key].css("*::text").get(default="") 
        yield i
    
    

    목록 포장 풀기를 사용하여 항목 필드를 채 웁니다 (부분적 으로이 이전 답변을 기반으로 함)
    테이블의 각 행에는 6 개의 열이 있으므로
    문서에 따라-방법 get 첫 경기 결과 반환
    이 방법을 사용하면 명시 적으로 사용할 필요가 없습니다. a 표 셀 선택기 내부의 태그.

  • 답변 # 3

    코드를 다시 작성하여이 문제를 해결했습니다. 모든 답변 기고자에게 감사합니다. @Gallaecio에게 감사드립니다. 내 해결책은 다음과 같습니다.

    import scrapy
    from scrapy.crawler import CrawlerProcess
    class AcncSpider(scrapy.Spider):
      name = "spider_name"
      allowed_domains = ["url"]
      start_urls = ['url']
      def parse(self, response):
        self.log('I just visited: ' + response.url)
        for i in response.css('div.view-content > div > table > tbody > tr.odd'):
            item = {
                'company_name': i.css('td.views-field.views-field-acnc-search-api-title-sort > a::text').extract(),
                 
                'status': i.css('td.views-field.views-field-acnc-search-api-status-normalised::text').extract(),
                
                'size': i.css('td.views-field.views-field-field-charity-size.views-align-center::text').extract(),
                 
                'suburb/town': i.css('td.views-field.views-field-acnc-search-api-address-locality::text').extract(),
                
                'state': i.css('td.views-field.views-field-acnc-search-api-address-administrative-area::text').extract(),
                 
                'ABN': i.css('td.views-field.views-field-acnc-search-api-abn-sort > a::text').extract(),
                'URL': response.urljoin(i.css('td.views-field.views-field-acnc-search-api-title-sort > a::attr(href)').extract_first()),
                       
            }
            yield item
        
        for i in response.css('div.view-content > div > table > tbody > tr.even'):
            item = { 
                'company_name': i.css('td.views-field.views-field-acnc-search-api-title-sort > a::text').extract(),
                 
                'status': i.css('td.views-field.views-field-acnc-search-api-status-normalised::text').extract(),
                
                'size': i.css('td.views-field.views-field-field-charity-size.views-align-center::text').extract(),
                 
                'suburb/town': i.css('td.views-field.views-field-acnc-search-api-address-locality::text').extract(),
                
                'state': i.css('td.views-field.views-field-acnc-search-api-address-administrative-area::text').extract(),
                 
                'ABN': i.css('td.views-field.views-field-acnc-search-api-abn-sort > a::text').extract(),
                'URL': response.urljoin(i.css('td.views-field.views-field-acnc-search-api-title-sort > a::attr(href)').extract_first())
            }
            yield item
        
        # follow pagination link
        next_page_url = response.css('li.next > a::attr(href)').extract_first()
        if next_page_url:
            next_page_url = response.urljoin(next_page_url)
            yield scrapy.Request(url=next_page_url, callback=self.parse)
    
    

  • 이전 next_permutation을 사용하여 길이 N C ++의 모든 조합 가져 오기
  • 다음 mysql - 제품 ID를 선택하고 주문 번호가 동일한 다른 모든 제품을 선택하는 방법은 무엇입니까?