【发布时间】:2018-07-24 02:54:33
【问题描述】:
我正在尝试使用 python 的 scrapy 库来抓取 projecteuler.net,只是为了练习它。我在网上看到了不止一个这样的刮板的现有实现,但它们对我来说似乎过于复杂了。我只想将问题(标题、ID、内容)保存在 json 中,然后在我的电脑上的本地网页中使用 ajax 加载。
我正在实施我的解决方案,无论如何我都会终止,但由于我想发现使用库的更智能方式,我要求你提出最智能的程序,用 scrapy 来完成这项工作(如果你想要避免json方式,直接保存在html中……对我来说可能更好)。
这是我的第一种方法(不起作用):
# -*- coding: utf-8 -*-
import httplib2
import requests
import scrapy
from eulerscraper.items import Problem
from scrapy.linkextractors import LinkExtractor
from scrapy.loader import ItemLoader
from scrapy.spiders import CrawlSpider, Rule
def start_urls_detection():
# su = ['https://projecteuler.net/archives', 'https://projecteuler.net/archives;page=2']
# i = 1
#
# while True:
# request = requests.get(su[i])
#
# if request.status_code != 200:
# break
#
# i += 1
# su.append('https://projecteuler.net/archives;page=' + str(i + 1))
return ["https://projecteuler.net/"]
class EulerSpider(CrawlSpider):
name = 'euler'
allowed_domains = ['projecteuler.net']
start_urls = start_urls_detection()
rules = (
# Extract links matching 'category.php' (but not matching 'subsection.php')
# and follow links from them (since no callback means follow=True by default).
# Rule(LinkExtractor(allow=('category\.php',), deny=('subsection\.php',))),
Rule(LinkExtractor(allow=('problem=\d*',)), callback="parse_problems"),
Rule(LinkExtractor(allow=('archives;page=\d*',), unique=True), follow=True)
)
def start_requests(self):
# su = ['https://projecteuler.net/archives', 'https://projecteuler.net/archives;page=2']
# i = 1
#
# while True:
# request = requests.get(su[i])
#
# if request.status_code != 200:
# break
#
# i += 1
# su.append('https://projecteuler.net/archives;page=' + str(i + 1))
return [scrapy.Request("https://projecteuler.net/archives", self.parse)]
def parse_problems(self, response):
l = ItemLoader(item=Problem(), response=response)
l.add_css("title", "h2")
l.add_css("id", "#problem_info")
l.add_css("content", ".problem_content")
yield l.load_item()
# def parse_content(self, response):
# #return response.css("div.problem_content::text").extract()
# next_page = "https://projecteuler.net/archives;page=2"
# n = 3
#
# while n < 14:
# next_page = response.urljoin(next_page)
# yield scrapy.Request(next_page, callback=self.parse)
# next_page = next_page[0:len(next_page) - 1] + str(n)
# n += 1
现在我将尝试一些 linkExtractor + 手动请求组合。在此期间,我希望等待您的解决方案...
【问题讨论】:
-
请阅读帮助文件以获取有关 StackOverflow 上所接受的问题类型的建议。
-
您应该提供您为解决问题而编写的代码。然后,如果您在这方面遇到困难,请寻求帮助。
标签: python html ajax web-scraping scrapy