【问题标题】:Find and scrape all URLs with specific format using Scrapy使用 Scrapy 查找并抓取具有特定格式的所有 URL
【发布时间】:2014-11-04 21:06:04
【问题描述】:

我正在使用 Scrapy 检索有关 https://www.indiegogo.com 上的项目的信息。我想用 url 格式www.indiegogo.com/projects/[NameOfProject] 抓取所有页面。但是,我不确定如何在爬网期间访问所有这些页面。我找不到硬编码链接到所有/projects/ 页面的母版页。所有项目似乎都可以从https://www.indiegogo.com/explore 访问(通过可见链接和搜索功能),但我无法确定将返回所有页面的链接/搜索查询集。我的蜘蛛代码如下。这些 start_urls 和规则刮掉了大约 6000 个页面,但我听说应该有接近 10 倍的数量。

关于带参数的url:使用的filter_quick参数值来自Explore页面上的“Trending”、“Final Countdown”、“New This Week”和“Most Funded”链接,显然错过了不受欢迎和差的资助的项目。 per_page url 参数没有最大值。

有什么建议吗?谢谢!

class IndiegogoSpider(CrawlSpider):
name = "indiegogo"
allowed_domains = ["indiegogo.com"]
start_urls = [
    "https://www.indiegogo.com/sitemap",
    "https://www.indiegogo.com/explore",
    "http://go.indiegogo.com/blog/category/campaigns-2",
    "https://www.indiegogo.com/explore?filter_browse_balance=true&filter_quick=countdown&per_page=50000",
    "https://www.indiegogo.com/explore?filter_browse_balance=true&filter_quick=new&per_page=50000",
    "https://www.indiegogo.com/explore?filter_browse_balance=true&filter_quick=most_funded&per_page=50000",
    "https://www.indiegogo.com/explore?filter_browse_balance=true&filter_quick=popular_all&per_page=50000"
]
rules = (
    Rule(LinkExtractor(allow=('/explore?'))),
    Rule(LinkExtractor(allow=('/campaigns-2/'))),
    Rule(LinkExtractor(allow=('/projects/')), callback='parse_item'),
)
def parse_item(self, response):
    [...]

旁注:当我尝试在浏览器中加载它们时,还有其他 URL 格式 www.indiegogo.com/projects/[NameOfProject]/[OtherStuff] 会重定向到所需的 URL 格式或给出 404 错误。我假设 Scrapy 正在正确处理重定向和空白页,但愿意听取验证这一点的方法。

【问题讨论】:

  • 你解决过这个问题吗?

标签: web-scraping scrapy webpage


【解决方案1】:

如果你有站点地图的链接,那么让 Scrapy 从那里获取页面并处理它们会更快。 这将像下面那样工作。

从 scrapy.contrib.spiders 导入 SitemapSpider

类 MySpider(SitemapSpider):

sitemap_urls = ['http://www.example.com/robots.txt']

//**您可以在sitemap_rules下设置提取URL的规则。

sitemap_rules = [
    ('/shop/', 'parse_shop'),
]
sitemap_follow = ['/sitemap_shops']

def parse_shop(self, response):
    pass # ... scrape shop here ...

【讨论】:

  • 站点地图仅直接链接到 1000 个项目。下面的代码只抓取了这 1000 个。我没有看到一种方法来告诉它遵循各种 URL,例如 CrawlSpider 让它遵循不直接在站点地图上的链接。我错过了什么吗? class IndiegogoSitemapSpider(SitemapSpider):name = "indiegogo_sitemap"sitemap_urls = ['https://www.indiegogo.com/sitemap.xml']def parse(self, response):[...]
【解决方案2】:

试试下面的代码,这将爬取网站并且只爬取“indiegogo.com/projects/”

import scrapy

from scrapy.contrib.spiders import CrawlSpider, Rule

from scrapy.contrib.linkextractors import LinkExtractor

from sitemap.items import myitem

class DmozSpider(CrawlSpider):

    name = 'indiego'

    allowed_domains = ['indiegogo.com']

        start_urls = [

        'http://indiegogo.com'

    ]

rules = (Rule(LinkExtractor(allow_domains=['indiegogo.com/projects/']), callback='parse_items', follow= True),)

        def parse_items(self, response):

        item = myitem()

        item['link'] = response.request.url

        item['title'] = response.xpath('//title').extract()

        yield item

【讨论】:

  • 这会在第一页停止,返回 0 个结果。我的猜测是它与LinkExtractorallow_domains 参数有关。你能解释一下这段代码如何解决我的问题的思考过程吗?
  • 是的,首页是否还有以“indiegogo.com/projects/”开头的链接
  • 啊,不,它们都是相对链接。我将其切换为 allow=['/projects/'] 但随后它只获得了主页上列出的 12 个项目。
猜你喜欢
  • 2017-08-15
  • 1970-01-01
  • 2022-12-07
  • 1970-01-01
  • 1970-01-01
  • 2014-02-25
  • 2012-01-12
  • 1970-01-01
  • 2021-02-05
相关资源
最近更新 更多