ฉันได้เขียนสไปเดอร์ซึ่งมีจุดประสงค์เพียงอย่างเดียวคือการดึงตัวเลขหนึ่งตัวจาก http://www.funda.nl/koop/amsterdam/ กล่าวคือ จำนวนหน้าสูงสุดจากเพจเจอร์ที่ด้านล่าง (เช่น หมายเลข 255 ในตัวอย่างด้านล่าง)
ฉันจัดการเพื่อทำสิ่งนี้โดยใช้ LinkExtractor ตามนิพจน์ทั่วไปที่ URL ของเพจเหล่านี้ตรงกัน แมงมุมแสดงไว้ด้านล่าง:
import scrapy
from scrapy.spiders import CrawlSpider, Rule
from scrapy.linkextractors import LinkExtractor
from scrapy.crawler import CrawlerProcess
from Funda.items import MaxPageItem
class FundaMaxPagesSpider(CrawlSpider):
name = "Funda_max_pages"
allowed_domains = ["funda.nl"]
start_urls = ["http://www.funda.nl/koop/amsterdam/"]
le_maxpage = LinkExtractor(allow=r'%s+p\d+' % start_urls[0]) # Link to a page containing thumbnails of several houses, such as http://www.funda.nl/koop/amsterdam/p10/
rules = (
Rule(le_maxpage, callback='get_max_page_number'),
)
def get_max_page_number(self, response):
links = self.le_maxpage.extract_links(response)
max_page_number = 0 # Initialize the maximum page number
page_numbers=[]
for link in links:
if link.url.count('/') == 6 and link.url.endswith('/'): # Select only pages with a link depth of 3
page_number = int(link.url.split("/")[-2].strip('p')) # For example, get the number 10 out of the string 'http://www.funda.nl/koop/amsterdam/p10/'
page_numbers.append(page_number)
# if page_number > max_page_number:
# max_page_number = page_number # Update the maximum page number if the current value is larger than its previous value
max_page_number = max(page_numbers)
print("The maximum page number is %s" % max_page_number)
yield {'max_page_number': max_page_number}
หากฉันรันสิ่งนี้ด้วยฟีดเอาต์พุตโดยป้อน scrapy crawl Funda_max_pages -o funda_max_pages.json
ที่บรรทัดคำสั่ง ไฟล์ JSON ผลลัพธ์จะมีลักษณะดังนี้:
[
{"max_page_number": 257},
{"max_page_number": 257},
{"max_page_number": 257},
{"max_page_number": 257},
{"max_page_number": 257},
{"max_page_number": 257},
{"max_page_number": 257}
]
ฉันพบว่ามันแปลกที่ dict ถูกส่งออก 7 ครั้งแทนที่จะเป็นเพียงครั้งเดียว ท้ายที่สุดแล้ว คำสั่ง yield
อยู่นอกลูป for
ใครสามารถอธิบายพฤติกรรมนี้ได้บ้าง