홈>
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
- 답변 # 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)
한 번에 하나의 문제에 집중합시다 :
값을 출력하도록 지시하는 대신 임시 변수를 사용하십시오.
당신은 또한 사용을 확인 할 수 있습니다
extract()
과extract_first()
. 문서는 실제로 최신 사용법을 권장합니다.get()
과getall()
덜 혼란 스럽기 때문에.