Uri*_*iCS 7 python scrapy web-scraping
我正在进行一项与分发互联网索引有关的研究。
虽然存在几个这样的项目(IRLbot、分布式索引、集群抓取、通用爬网等),但我的更专注于激励这种行为。我正在寻找一种简单的方法来抓取真实的网页,而无需了解它们的 URL 或 HTML 结构,并且:
澄清一下 - 这仅适用于概念证明(PoC),所以我不介意它不会扩展,它很慢等。在大多数情况下,我的目标是抓取呈现给用户的大部分文本,有或没有动态内容,以及尽可能少的“垃圾”,如函数、标签、关键字等。开箱即用的简单部分解决方案优于需要大量专业知识才能部署的完美解决方案。
第二个问题是存储(url,提取的文本)以进行索引(通过不同的过程?),但我想我可以通过更多的挖掘来解决这个问题。
任何关于如何增强“itsy”的解析功能的建议将不胜感激!
import scrapy
from scrapy_1.tutorial.items import WebsiteItem
class FirstSpider(scrapy.Spider):
name = 'itsy'
# allowed_domains = ['dmoz.org']
start_urls = \
[
"http://www.stackoverflow.com"
]
# def parse(self, response):
# filename = response.url.split("/")[-2] + '.html'
# with open(filename, 'wb') as f:
# f.write(response.body)
def parse(self, response):
for sel in response.xpath('//ul/li'):
item = WebsiteItem()
item['title'] = sel.xpath('a/text()').extract()
item['link'] = sel.xpath('a/@href').extract()
item['body_text'] = sel.xpath('text()').extract()
yield itemRun Code Online (Sandbox Code Playgroud)
你在这里找的是scrapy CrawlSpider
CrawlSpider 允许您定义每个页面遵循的抓取规则。它足够智能,可以避免抓取非网络资源的图像、文档和其他文件,它几乎可以为您完成所有工作。
下面是一个很好的例子,你的蜘蛛可能看起来像 CrawlSpider:
from scrapy.spiders import CrawlSpider, Rule
from scrapy.linkextractors import LinkExtractor
class MySpider(CrawlSpider):
name = 'crawlspider'
start_urls = ['http://scrapy.org']
rules = (
Rule(LinkExtractor(), callback='parse_item', follow=True),
)
def parse_item(self, response):
item = dict()
item['url'] = response.url
item['title'] = response.meta['link_text']
# extracting basic body
item['body'] = '\n'.join(response.xpath('//text()').extract())
# or better just save whole source
item['source'] = response.body
return item
Run Code Online (Sandbox Code Playgroud)
这个蜘蛛会抓取它可以在网站上找到的每个网页,并记录标题、网址和整个文本正文。
对于文本正文,您可能希望以更智能的方式提取它(以排除 javascript 和其他不需要的文本节点),但这是一个需要讨论的问题。实际上,对于您所描述的内容,您可能希望保存完整的 html 源代码,而不仅仅是文本,因为非结构化文本对于任何类型的分析或索引都是无用的。
还有一堆可以为这种类型的爬行调整的scrapy设置。它在Broad Crawl docs page 中有很好的描述