หลีกเลี่ยงการถูกแบนบนไซต์โดยใช้ scrapy

ฉันกำลังพยายามดาวน์โหลดข้อมูลจาก gsmarena โค้ดตัวอย่างในการดาวน์โหลดข้อมูลจำเพาะ HTC one me มาจากไซต์ต่อไปนี้ "http://www.gsmarena.com/htc_one_me-7275.php" ตามที่กล่าวไว้ด้านล่าง:

ข้อมูลบนเว็บไซต์จัดอยู่ในรูปแบบตารางและแถวของตาราง ข้อมูลอยู่ในรูปแบบ:

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

ไฟล์ Items.py:

import scrapy

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

ไฟล์แมงมุม:

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

อย่างไรก็ตาม ฉันจะถูกแบนทันทีที่ฉันพยายามโหลดหน้าใน scrapy shell โดยใช้:

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

ฉันได้ลองใช้ DOWNLOAD_DELAY = 3 ใน settings.py แล้ว

กรุณาแนะนำฉันควรทำอย่างไร


person ajhavery    schedule 12.06.2015    source แหล่งที่มา


คำตอบ (3)


นั่นอาจเกิดขึ้นเนื่องจาก User Agent ของ Scrapy ดังที่คุณเห็นที่นี่ ตัวแปร BOT_NAME ใช้ในการเขียน USER_AGENT . ฉันเดาว่าไซต์ที่คุณต้องการรวบรวมข้อมูลกำลังบล็อกสิ่งนั้นอยู่ ฉันพยายามตรวจดูไฟล์ robots.txt ของพวกเขา แต่ก็ไม่พบเบาะแสจากที่นั่น

คุณสามารถลองตั้งค่า UserAgent ที่กำหนดเองได้ ใน settings.py ของคุณให้เพิ่มบรรทัดต่อไปนี้:

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

จริงๆ แล้ว USER_AGENT ของคุณอาจเป็น ใครก็ตามที่เกี่ยวข้องกับเบราว์เซอร์

person FBidu    schedule 12.06.2015
comment
น่าสนใจ... ฉันพยายามเล่นรอบๆ เว็บไซต์โดยใช้ตัวสลับ UserAgent และตอนนี้ฉันไม่สามารถโหลดหน้าใดๆ ได้เลย! ไซต์นี้อาจมีนโยบายที่เข้มงวดมากในการแบนผู้ใช้ตาม IP หากปรากฏพร้อมกับ UserAgent ประเภทใดก็ตามที่แสดงถึงโปรแกรมรวบรวมข้อมูล ดังนั้นคุณอาจไม่สามารถโหลดได้อีกต่อไปในระยะเวลาหนึ่ง - person FBidu; 12.06.2015

หากต้องการเพิ่มเรื่องราว "การตั้งค่าตัวแทนผู้ใช้จริงและแกล้งทำเป็นเบราว์เซอร์จริง" นี่คือมิดเดิลแวร์ที่ฉันอัปโหลดบน GitHub:

ขึ้นอยู่กับ fake-useragent package และใช้ส่วนหัว User-Agent แบบสุ่มที่แตกต่างกันสำหรับทุกคำขอโดยยึดตาม สถิติการใช้งานเบราว์เซอร์ในโลกแห่งความเป็นจริง


นอกจากนี้ ตรวจสอบให้แน่ใจว่าคุณไม่ได้ละเมิดกฎหรือข้อกำหนดการใช้งานของเว็บไซต์ ดูสิ่งนี้ด้วย:

person alecxe    schedule 12.06.2015

หากเห็นได้ชัดว่าไซต์ไม่ต้องการถูกคัดลอกเลย การคิดวิธีแก้ปัญหาใหม่เป็นเพียงการชะลอสิ่งที่หลีกเลี่ยงไม่ได้เท่านั้น ไซต์เหล่านี้จะวางกฎใหม่เพื่อป้องกันเคล็ดลับใหม่ของคุณ และคุณจะกลับมาที่จุดเดิมอีกครั้ง

พูดคุยกับผู้ดูแลไซต์ -- เว้นแต่พวกเขาจะป้องกันการขูดรีดเพียงเพื่อทำให้ชีวิตของผู้อื่นยากลำบาก (เช่นเดียวกับองค์กรเชิงพาณิชย์บางแห่งทำ) พวกเขาอาจมีทางเลือกที่ดี เช่น API หรือฟีด (ชำระเงิน?) ที่คุณสามารถสมัครรับข้อมูลได้

person tripleee    schedule 12.06.2015