python - 避免在使用 scrapy 的网站上被禁止

标签 python web-scraping scrapy

我正在尝试从 gsmarena 下载数据。下载 HTC one me spec 的示例代码来自以下站点“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"

我什至尝试在 settings.py 中使用 DOWNLOAD_DELAY = 3。

请建议我应该怎么做。

最佳答案

这可能是因为 Scrapy 的用户代理。如你所见hereBOT_NAME 变量用于组成 USER_AGENT。我的猜测是您要抓取的网站正在阻止它。我试图查看他们的 robots.txt file但从那里没有任何线索。

您可以尝试设置自定义 UserAgent。在您的 settings.py 中添加以下行:

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

实际上,您的 USER_AGENT 可能是 anyone related to a browser

关于python - 避免在使用 scrapy 的网站上被禁止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30805566/

相关文章:

python - JSON 到 Python Pandas 数据框

python - 如何在 Ubuntu 14.04 中通过 Apache 网络服务器运行两个 django 项目?

python - 使用 python 抓取网站

Python:使用另一个列表顺序对列表进行排序,具有不同的长度,并且没有 'sorted'

python - 使用 matplotlib 时下标不是新罗马字体

Python - 单击链接时抓取数据不会更改 URL

php - strtotime 不插入数据库

python - 单击登录按钮后 Ebay 网站挂起 - Selenium Python

python-2.7 - 使用 XPath 选择 HTML 文档中除脚本节点之外的每个文本节点

python - 如何从网站上抓取动态内容?