没有页面结构知识的Web抓取

时间:2014-05-28 21:14:00

标签: python web-scraping beautifulsoup web-crawler

我试图通过编写脚本来教自己一个概念。基本上,我尝试编写一个Python脚本,在给出一些关键字的情况下,会抓取网页,直到找到我需要的数据。例如,假设我想找一份居住在美国的恶意蛇列表。我可能会使用关键字list,venemous,snakes,US来运行我的脚本,并且我希望能够相信至少80%的确定它将返回美国的蛇列表。

我已经知道如何实现网络蜘蛛部分了,我只想了解如何在不了解网页结构的情况下确定网页的相关性。我研究过网络抓取技术,但他们似乎都假设知道页面的html标签结构。是否有某种算法允许我从页面中提取数据并确定其相关性?

任何指针都将非常感激。我将PythonurllibBeautifulSoup一起使用。

2 个答案:

答案 0 :(得分:6)

使用像scrapy这样的爬虫(仅用于处理并发下载),你可以编写一个这样的简单蜘蛛,并且可能从维基百科开始作为一个很好的起点。此脚本是使用scrapynltkwhoosh的完整示例。它将永远不会停止,并将使用whoosh为以后的搜索索引链接 这是一个小型谷歌:

_Author = Farsheed Ashouri
import os
import sys
import re
## Spider libraries
from scrapy.spider import BaseSpider
from scrapy.selector import Selector
from main.items import MainItem
from scrapy.http import Request
from urlparse import urljoin
## indexer libraries
from whoosh.index import create_in, open_dir
from whoosh.fields import *
## html to text conversion module
import nltk

def open_writer():
    if not os.path.isdir("indexdir"):
        os.mkdir("indexdir")
        schema = Schema(title=TEXT(stored=True), content=TEXT(stored=True))
        ix = create_in("indexdir", schema)
    else:
        ix = open_dir("indexdir")
    return ix.writer()

class Main(BaseSpider):
    name        = "main"
    allowed_domains = ["en.wikipedia.org"]
    start_urls  = ["http://en.wikipedia.org/wiki/Snakes"]

    def parse(self, response):
        writer = open_writer()  ## for indexing
        sel = Selector(response)
        email_validation = re.compile(r'^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,4})$')
        #general_link_validation = re.compile(r'')
        #We stored already crawled links in this list
        crawledLinks    = set()
        titles = sel.xpath('//div[@id="content"]//h1[@id="firstHeading"]//span/text()').extract()
        contents = sel.xpath('//body/div[@id="content"]').extract()
        if contents:
            content = contents[0]
        if titles: 
            title = titles[0]
        else:
            return
        links   = sel.xpath('//a/@href').extract()


        for link in links:
            # If it is a proper link and is not checked yet, yield it to the Spider
            url = urljoin(response.url, link)
            #print url
            ## our url must not have any ":" character in it. link /wiki/talk:company
            if not url in crawledLinks and re.match(r'http://en.wikipedia.org/wiki/[^:]+$', url):
                crawledLinks.add(url)
                  #print url, depth
                yield Request(url, self.parse)
        item = MainItem()
        item["title"] = title
        print '*'*80
        print 'crawled: %s | it has %s links.' % (title, len(links))
        #print content
        print '*'*80
        item["links"] = list(crawledLinks)
        writer.add_document(title=title, content=nltk.clean_html(content))  ## I save only text from content.
        #print crawledLinks
        writer.commit()
        yield item
完成scrapy示例的

This is the file

答案 1 :(得分:2)

你基本上都在问“我该如何编写搜索引擎”。这......并非无足轻重。

这样做的正确方法是使用Google(或Bing,或Yahoo!或者......)搜索API并显示前n个结果。但是,如果你只是在制作一个个人项目来教自己一些概念(不知道那些概念会是哪些概念),那么这里有一些建议:

  • 搜索相关关键字(duh)的相应标签(<p><div>等)的文字内容
  • 使用相关的关键字检查是否存在可能包含您要查找的内容的代码。例如,如果您要查找事物列表,那么包含<ul><ol>甚至<table>的网页可能是一个不错的选择
  • 构建同义词词典,并在每个页面中搜索关键词的同义词。将自己限制为“美国”可能意味着仅包含“美国”的页面的人为低排名
  • 在您的关键字组中保留的单词列表,并为包含大部分关键字的网页提供更高的排名。这些页面(可以说)更有可能包含您正在寻找的答案
祝你好运(你需要它)!