Scrapy不按照allowed_domains过滤结果

时间:2017-01-29 17:03:19

标签: python python-3.x web-scraping scrapy web-crawler

几乎与scrapy allow all subdomains重复!

注意:首先,我是Scrapy&的新手。我没有足够的声誉对this问题发表评论。所以,我决定问一个新的!

  

问题陈述:

我使用BeautifulSoup来废弃特定网站的电子邮件地址。如果该特定页面上的电子邮件地址可用(即example.com),它可以正常工作,但如果example.com/contact-us上有可用的话,则非常明显!

出于这个原因,我决定使用Scrapy。虽然我正在使用allowed_domains 只获得与域名相关的链接,它也为我提供了所有的异地链接。我在this问题中尝试了@agstudy提出的另一种方法,在规则中使用SgmlLinkExtractor。

然后我收到了这个错误,

Traceback (most recent call last):     
    File "/home/msn/Documents/email_scraper/email_scraper/spiders/emails_spider.py", line 14, in <module>
        from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor  
    File "/home/msn/Documents/scrapy/lib/python3.5/site-packages/scrapy/contrib/linkextractors/sgml.py", line 7, in <module>  
      from scrapy.linkextractors.sgml import *  
    File "/home/msn/Documents/scrapy/lib/python3.5/site-packages/scrapy/linkextractors/sgml.py", line 7, in <module>  
      from sgmllib import SGMLParser  
ImportError: No module named 'sgmllib'

基本上,ImportError是关于Python 3.x中sgmlib(简单SGML解析器)的弃用

  

到目前为止我尝试了什么:

class EmailsSpiderSpider(scrapy.Spider):
    name = 'emails'
    # allowed_domains = ['example.com']
    start_urls = [
        'http://example.com/'
    ]

    rules = [
        Rule(SgmlLinkExtractor(allow_domains=("example.com"),), callback='parse_url'),
    ]

    def parse_url(self, response):
        hxs = HtmlXPathSelector(response)
        urls = hxs.select("//a/@href").extract()
        print(set(urls))  # sanity check

我也尝试过使用CrawlSpider的LxmlLinkExtractor,但仍然会获得非现场链接。

我该怎么做才能完成这项工作?或者我解决问题的方法是错误的吗?

任何帮助将不胜感激!

另一个注意事项: 每次网站都不同于废弃电子邮件。所以,我不能使用特定的HTML或CSS选择器!

1 个答案:

答案 0 :(得分:1)

您在hxs.select('//a/@href')中使用xpath表达式,这意味着从页面上的所有href标记中提取a属性值,这样您就可以获得包括异地在内的所有链接那些。您可以使用的是LinkExtractor,它将是这样的:

from scrapy.linkextractors import LinkExtractor

def parse_url(self, 
    urls = [l.url for l in LinkExtractor(allow_domains='example.com').extract_links(response)]
    print(set(urls))  # sanity check

这就是LinkExtractor真正为我做的事情。(我猜)。

顺便说一句,请记住,您可以在Internet(包括Stackoverflow)中找到的大多数Scrapy示例都是指早期版本,它们与Python 3完全兼容。