Saya sangat baru mengenal python dan scrapy dan memutuskan untuk mencoba dan membangun laba-laba alih-alih hanya takut dengan bahasa yang tampak baru/menantang.

Jadi ini adalah laba-laba pertama dan tujuannya:

  • Ini berjalan melalui halaman situs web (melalui tautan yang ditemukan di setiap halaman)
  • Daftar semua link (a>href) yang ada di setiap halaman
  • Ditulis di setiap baris: halaman tempat tautan ditemukan, tautan itu sendiri (didekode+bahasa), jumlah tautan di setiap halaman, dan kode respons http dari setiap tautan.

Masalah yang saya hadapi adalah tidak pernah menghentikan perayapan, sepertinya macet dalam satu lingkaran dan selalu merayapi ulang setiap halaman lebih dari sekali ...

Apa kesalahan yang telah aku perbuat? (jelas banyak hal karena saya tidak pernah menulis kode python sebelumnya, tapi tetap saja) Bagaimana saya bisa membuat laba-laba merayapi setiap halaman hanya sekali?

import scrapy
from scrapy.spiders import CrawlSpider, Rule
from scrapy.linkextractors import LinkExtractor
import urllib.parse
import requests
import threading


class TestSpider(CrawlSpider):
    name = "test"
    allowed_domains = ["cerve.co"]
    start_urls = ["https://cerve.co"]
        rules = [Rule (LinkExtractor(allow=['.*'], tags='a', attrs='href'), callback='parse_item', follow=True)]
    
        def parse_item(self, response):
             alllinks = response.css('a::attr(href)').getall()
             for link in alllinks:
                 link = response.urljoin(link)
                 yield {
                    'page': urllib.parse.unquote(response.url),
                    'links': urllib.parse.unquote(link),
                    'number of links': len(alllinks),
                    'status': requests.get(link).status_code
                 }
1
TryingToLearn 4 Juli 2020, 14:22

1 menjawab

Jawaban Terbaik

Scrapy berkata : Secara default, Scrapy memfilter permintaan duplikat ke URL yang sudah dikunjungi. Ini dapat dikonfigurasi dengan pengaturan DUPEFILTER_CLASS.

Solusi 1 : https://docs.scrapy.org/en/latest/topics/settings.html#std-setting-DUPEFILTER_CLASS

Pengalaman saya dengan kode Anda : Ada begitu banyak link. Dan saya tidak melihat url duplikat yang dikunjungi dua kali.

Solusi 2 dalam kasus terburuk
Dalam settings.py set DEPTH_LIMIT= beberapa nomor pilihan Anda

0
akash 4 Juli 2020, 19:13