Hindari pemblokiran situs yang menggunakan scrapy

Saya mencoba mengunduh data dari gsmarena. Contoh kode untuk mengunduh spesifikasi HTC one me adalah dari situs berikut "http://www.gsmarena.com/htc_one_me-7275.php" seperti yang disebutkan di bawah ini:

Data pada website diklasifikasikan dalam bentuk tabel dan baris tabel. Datanya berformat:

table header > td[@class='ttl'] > td[@class='nfo']

File item.py:

import scrapy

class gsmArenaDataItem(scrapy.Item):
    phoneName = scrapy.Field()
    phoneDetails = scrapy.Field()
    pass

Berkas laba-laba:

from scrapy.selector import Selector
from scrapy import Spider
from gsmarena_data.items import gsmArenaDataItem

class testSpider(Spider):
    name = "mobile_test"
    allowed_domains = ["gsmarena.com"]
    start_urls = ('http://www.gsmarena.com/htc_one_me-7275.php',)

    def parse(self, response):
        # extract whatever stuffs you want and yield items here
        hxs = Selector(response)
        phone = gsmArenaDataItem()
        tableRows = hxs.css("div#specs-list table")
        for tableRows in tableRows:
            phone['phoneName'] = tableRows.xpath(".//th/text()").extract()[0]
            for ttl in tableRows.xpath(".//td[@class='ttl']"):
                ttl_value = " ".join(ttl.xpath(".//text()").extract())
                nfo_value = " ".join(ttl.xpath("following-sibling::td[@class='nfo']//text()").extract())
                colonSign = ": "
                commaSign = ", "
                seq = [ttl_value, colonSign, nfo_value, commaSign]
                seq = seq.join(seq)
        phone['phoneDetails'] = seq
        yield phone

Namun, saya diblokir segera setelah saya mencoba memuat halaman di shell scrapy menggunakan:

"http://www.gsmarena.com/htc_one_me-7275.php"

Saya bahkan sudah mencoba menggunakan DOWNLOAD_DELAY = 3 di settings.py.

Mohon sarankan bagaimana saya harus melakukannya.


person ajhavery    schedule 12.06.2015    source sumber


Jawaban (3)


Itu mungkin terjadi karena Agen Pengguna Scrapy. Seperti yang Anda lihat di sini, variabel BOT_NAME digunakan untuk menyusun USER_AGENT . Dugaan saya adalah situs yang ingin Anda jelajahi memblokirnya. Saya mencoba memeriksa file robots.txt mereka tetapi tidak mendapat petunjuk dari sana.

Anda dapat mencoba menyiapkan Agen Pengguna khusus. Di settings.py Anda tambahkan baris berikut:

USER_AGENT = "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:38.0) Gecko/20100101 Firefox/38.0"

Sebenarnya, USER_AGENT Anda mungkin siapa pun yang terkait dengan browser

person FBidu    schedule 12.06.2015
comment
Menarik... Saya mencoba bermain-main di situs web menggunakan pengalih UserAgent dan sekarang saya tidak dapat memuat halaman apa pun sama sekali! Situs ini mungkin memiliki kebijakan yang sangat ketat dalam melarang pengguna berdasarkan IP mereka jika mereka muncul dengan UserAgent apa pun yang menunjukkan perayap sehingga Anda mungkin tidak dapat memuatnya lagi untuk sementara waktu. - person FBidu; 12.06.2015

Untuk menambah cerita "Menyetel Agen-Pengguna yang sebenarnya dan berpura-pura menjadi browser yang sebenarnya", berikut adalah middleware yang saya unggah di github:

Ini didasarkan pada fake-useragent paket dan menggunakan header User-Agent acak yang berbeda untuk setiap permintaan berdasarkan statistik penggunaan browser dunia nyata.


Selain itu, pastikan Anda tidak melanggar aturan atau ketentuan penggunaan situs web apa pun. Lihat juga:

person alecxe    schedule 12.06.2015

Jika situs tersebut jelas-jelas tidak ingin dihapus sama sekali, merancang solusi baru hanya menunda hal yang tidak dapat dihindari -- mereka akan menerapkan aturan baru untuk mencegah trik baru Anda, dan Anda kembali ke titik awal.

Bicaralah dengan admin situs -- kecuali mereka mencegah pengikisan hanya untuk mempersulit orang lain (seperti yang dilakukan beberapa entitas komersial), mereka mungkin memiliki alternatif yang baik, seperti API atau feed (berbayar?) yang dapat Anda langgani.

person tripleee    schedule 12.06.2015