标签: scrapy-spider

Scrapy CrawlSpider 基于 start_urls 的动态规则?

我正在编写一个 Scrapy 抓取器,它使用 CrawlSpider 来抓取站点,查看其内部链接,并抓取任何外部链接(域与原始域不同的域的链接)的内容。

我设法用 2 条规则做到了这一点,但它们基于被抓取的站点的域。如果我想在多个网站上运行它,我会遇到一个问题,因为我不知道我目前在哪个“start_url”上,所以我无法适当地更改规则。

到目前为止,这是我想到的,它适用于一个网站,但我不确定如何将其应用于网站列表:

class HomepagesSpider(CrawlSpider):
    name = 'homepages'

    homepage = 'http://www.somesite.com'

    start_urls = [homepage]

    # strip http and www
    domain = homepage.replace('http://', '').replace('https://', '').replace('www.', '')
    domain = domain[:-1] if domain[-1] == '/' else domain

    rules = (
        Rule(LinkExtractor(allow_domains=(domain), deny_domains=()), callback='parse_internal', follow=True),
        Rule(LinkExtractor(allow_domains=(), deny_domains=(domain)), callback='parse_external', follow=False),
    )

    def parse_internal(self, response):

        # log internal page...

    def parse_external(self, response):

        # parse external page...
Run Code Online (Sandbox Code Playgroud)

这可能可以通过在调用刮刀时将 start_url 作为参数传递来完成,但我正在寻找一种在刮刀本身内以编程方式执行此操作的方法。

有任何想法吗?谢谢!

西蒙。

python web-crawler scrapy web-scraping scrapy-spider

1
推荐指数
1
解决办法
1485
查看次数

抓取-使用第一个网址的结果抓取多个网址

  1. 我使用Scrapy从第一个URL抓取数据。
  2. 第一个URL返回一个包含URL列表的响应。

到目前为止对我来说还可以。我的问题是如何进一步抓取此URL列表?搜索后,我知道我可以在解析中返回一个请求,但似乎只能处理一个URL。

这是我的解析:

def parse(self, response):
    # Get the list of URLs, for example:
    list = ["http://a.com", "http://b.com", "http://c.com"]
    return scrapy.Request(list[0])
    # It works, but how can I continue b.com and c.com?
Run Code Online (Sandbox Code Playgroud)

我可以那样做吗?

def parse(self, response):
    # Get the list of URLs, for example:
    list = ["http://a.com", "http://b.com", "http://c.com"]

    for link in list:
        scrapy.Request(link)
        # This is wrong, though I need something like this
Run Code Online (Sandbox Code Playgroud)

完整版本:

import scrapy

class MySpider(scrapy.Spider):
    name = "mySpider"
    allowed_domains = ["x.com"]
    start_urls = ["http://x.com"]

    def …
Run Code Online (Sandbox Code Playgroud)

python scrapy scrapy-spider

0
推荐指数
1
解决办法
4525
查看次数

使用scrapy中的for循环从多个URL中抓取信息

我想从多个网址抓取信息.我使用以下代码但它不起作用.愿有人请我指出我出错的地方吗?

import scrapy

class spider1(scrapy.Spider):
    name = "spider1"
    domain = "http://www.amazon.com/dp/"
    ASIN = ['B01LA6171I', 'B00OUKHTLO','B00B7LUVZK']

    def start_request(self):
        for i in ASIN:
            yield scrapy.Request(url=domain+i,callback = self.parse)

    def parse(self, response):
       title =response.css("span#productTitle::text").extract_first().strip()
       ASIN_ext = response.xpath("//input[@name='ASIN']/@value").extract_first()
       data = {"ASIN":ASIN_ext,"title":title,}
       yield data
Run Code Online (Sandbox Code Playgroud)

python amazon web-crawler scrapy scrapy-spider

0
推荐指数
1
解决办法
1642
查看次数

自定义BaseSpider Scrapy

我想在自定义基本蜘蛛类中具有一些针对蜘蛛的通用功能。

通常,y抓的蜘蛛从scrapy.Spider类继承。

我尝试在scrapy的spiders文件夹中创建BaseSpider类,但该类无效

import scrapy


class BaseSpider(scrapy.Spider):
    def __init__(self):
        super(scrapy.Spider).__init__()

    def parse(self, response):
        pass
Run Code Online (Sandbox Code Playgroud)

这是我真正的蜘蛛

import scrapy
import BaseSpider


class EbaySpider(BaseSpider):
    name = "ebay"
    allowed_domains = ["ebay.com"]

    def __init__(self):
        self.redis = Redis(host='redis', port=6379)
    # rest of the spider code
Run Code Online (Sandbox Code Playgroud)

给出这个错误

TypeError: Error when calling the metaclass bases
    module.__init__() takes at most 2 arguments (3 given)
Run Code Online (Sandbox Code Playgroud)

然后我尝试使用多重继承,使我的eBay Spider看起来像

class EbaySpider(scrapy.Spider, BaseSpider):

    name = "ebay"
    allowed_domains = ["ebay.com"]

    def __init__(self):
        self.redis = Redis(host='redis', port=6379)
    # rest of the spider code …
Run Code Online (Sandbox Code Playgroud)

python scrapy scrapy-spider

0
推荐指数
1
解决办法
621
查看次数

无法摆脱csv输出中的空行

我在python scrapy中编写了一个非常小的脚本来解析黄页网站上多个页面显示的名称,街道和电话号码.当我运行我的脚本时,我发现它运行顺利.但是,我遇到的唯一问题是数据在csv输出中被刮掉的方式.它总是两行之间的行(行)间隙.我的意思是:数据每隔一行打印一次.看到下面的图片,你就会明白我的意思.如果不是scrapy,我可以使用[newline =''].但是,不幸的是我在这里完全无助.如何摆脱csv输出中出现的空白行?提前谢谢你看看它.

items.py包括:

import scrapy

class YellowpageItem(scrapy.Item):
    name = scrapy.Field()
    street = scrapy.Field()
    phone = scrapy.Field()
Run Code Online (Sandbox Code Playgroud)

这是蜘蛛:

import scrapy

class YellowpageSpider(scrapy.Spider):
    name = "YellowpageSp"
    start_urls = ["https://www.yellowpages.com/search?search_terms=Pizza&geo_location_terms=Los%20Angeles%2C%20CA&page={0}".format(page) for page in range(2,6)]

    def parse(self, response):
        for titles in response.css('div.info'):
            name = titles.css('a.business-name span[itemprop=name]::text').extract_first()
            street = titles.css('span.street-address::text').extract_first()
            phone = titles.css('div[itemprop=telephone]::text').extract_first()
            yield {'name': name, 'street': street, 'phone':phone}
Run Code Online (Sandbox Code Playgroud)

以下是csv输出的样子:

在此输入图像描述

顺便说一句,我用来获取csv输出的命令是:

scrapy crawl YellowpageSp -o items.csv -t csv
Run Code Online (Sandbox Code Playgroud)

csv scrapy web-scraping python-3.x scrapy-spider

0
推荐指数
1
解决办法
832
查看次数

如何使用scrapy每晚刮掉数万个网址

我正在使用scrapy刮掉一些大品牌来导入我网站的销售数据.目前我正在使用

DOWNLOAD_DELAY = 1.5

CONCURRENT_REQUESTS_PER_DOMAIN = 16

CONCURRENT_REQUESTS_PER_IP = 16
Run Code Online (Sandbox Code Playgroud)

我使用Item加载器指定css/xpath规则和Pipeline将数据写入csv.我收集的数据是原价,销售价格,颜色,尺寸,名称,图片网址和品牌.

我只为一个拥有大约10万网址的商家写了蜘蛛,这需要我大约4个小时.

我的问题是,对于10k网址,4小时听起来是否正常,或者它应该比这更快.如果是这样,我还需要做些什么来加快速度.

我只在本地使用一个SPLASH实例进行测试.但在生产中我计划使用3个SPLASH实例.

现在主要问题是,我有大约125个商家和每个平均10k产品.他们中的一对有超过150k的网址.

我需要每晚清理所有数据以更新我的网站.由于我的单个蜘蛛花了4个小时来刮掉10k网址,我想知道每晚实现125 x 10k网址是否真的是有效的梦想

我将非常感谢您对我的问题的经验输入.

python scrapy scrapy-spider scrapy-pipeline scrapy-splash

0
推荐指数
1
解决办法
411
查看次数

Scrapy Spider 不保存数据

我正在尝试使用 Scrapy 将篮球队的时间表保存到 CSV 文件中。我在这些文件中编写了以下代码:

设置.py

BOT_NAME = 'test_project'

SPIDER_MODULES = ['test_project.spiders']
NEWSPIDER_MODULE = 'test_project.spiders'

FEED_FORMAT = "csv"
FEED_URI = "cportboys.csv"

# Crawl responsibly by identifying yourself (and your website) on the user-agent
#USER_AGENT = 'test_project (+http://www.yourdomain.com)'

# Obey robots.txt rules
ROBOTSTXT_OBEY = True
Run Code Online (Sandbox Code Playgroud)

khsabot.py

import scrapy


class KhsaabotSpider(scrapy.Spider):
    name = 'khsaabot'
    allowed_domains = ['https://scoreboard.12dt.com/scoreboard/khsaa/kybbk17/?id=51978']
    start_urls = ['http://https://scoreboard.12dt.com/scoreboard/khsaa/kybbk17/?id=51978/']

def parse(self, response):
    date = response.css('.mdate::text').extract()
    opponent = response.css('.opponent::text').extract()
    place = response.css('.schedule-loc::text').extract()


    for item in zip(date,opponent,place):
        scraped_info = {
            'date' : item[0], …
Run Code Online (Sandbox Code Playgroud)

python terminal scrapy web-scraping scrapy-spider

0
推荐指数
1
解决办法
803
查看次数