-1

我是 Scrapy 的新手,并试图从网页中提取内容,但在输出中得到了很多额外的字符。见附图。

如何更新我的代码以摆脱字符?我只需要从网页中提取 href。

Web 提取的输出文件图像

我的代码:

class AttractionSpider(CrawlSpider):
name = "get-webcontent"
start_urls = [
    'http://quotes.toscrape.com/page/1/'
]
rules = ()
def create_dirs(dir):    
    if not os.path.exists(dir):
        os.makedirs(dir)
    else:
        shutil.rmtree(dir)           #removes all the subdirectories!
        os.makedirs(dir)

def __init__(self, name=None, **kwargs):
    super(AttractionSpider, self).__init__(name, **kwargs)
    self.items_buffer = {}
    self.base_url = "http://quotes.toscrape.com/page/1/"        
    from scrapy.conf import settings
    settings.overrides['DOWNLOAD_TIMEOUT'] = 360
def write_to_file(file_name, content_list):
    with open(file_name, 'wb') as fp:
        pickle.dump(content_list, fp)

def parse(self, response):
    print ("Start scrapping webcontent....")        
    try:            
        str = ""
        hxs = Selector(response)
        links = hxs.xpath('//li//@href').extract()
        with open('test1_href', 'wb') as fp:
            pickle.dump(links, fp)
        if not links:               
            return
            log.msg("No Data to scrap")
        for link in links:
            v_url = ''.join( link.extract() )           
            if not v_url:
                continue
            else:
                _url = self.base_url + v_url
    except Exception as e:
        log.msg("Parsing failed for URL {%s}"%format(response.request.url))
        raise 

def parse_details(self, response):
    print ("Start scrapping Detailed Info....")
    try:
        hxs = Selector(response)            
        yield l_venue
    except Exception as e:
        log.msg("Parsing failed for URL {%s}"%format(response.request.url))
        raise
4

1 回答 1

1

现在我必须说......显然你有一些 Python 编程经验,恭喜你,而且你显然正在做官方的 Scrapy 文档教程,这很棒,但对于我的生活,我不知道你提供的代码片段到底是什么你想要完成的事情。但没关系,这里有几件事:

您正在使用 Scrapy 爬行蜘蛛。当使用交叉蜘蛛时,规则设置跟随或分页,如果你愿意,当适当的正则表达式将规则与页面匹配时将汽车指向函数,然后初始化提取或分项。这对于理解你不能在不设置规则的情况下使用交叉火力是绝对重要的,同样重要的是,在使用交叉蜘蛛时你不能使用 parse 函数,因为交叉蜘蛛的构建方式 parse 函数已经是一个原生的内置函数自身之内。请继续阅读文档,或者只是创建一个交叉蜘蛛,看看它是如何在解析中不创建的。

你的代码

class AttractionSpider(CrawlSpider):
name = "get-webcontent"
start_urls = [
    'http://quotes.toscrape.com/page/1/'
]
rules = () #big no no ! s3 rul3s

它应该是什么样子

class AttractionSpider(CrawlSpider):
    name = "get-webcontent"
    start_urls = ['http://quotes.toscrape.com'] # this would be cosidered a base url
    

# regex is our bf, kno him well, bassicall all pages that follow 
#this pattern ... page/.* (meant all following include no exception)
    rules = (
            Rule(LinkExtractor(allow=r'/page/.*'), follow=True),callback='parse_item'),
            )

第二:复习一下我提到的关于使用 Scrapy crawl spider 的 parts 函数,你应该使用“parse-_item”;我假设您至少查看了官方文档,但总结一下,之所以不能使用它,是因为爬虫已经在其逻辑中使用了 Parts,所以通过在交叉蜘蛛中使用 Parts,您将覆盖本机功能它具有并且可能导致各种错误和问题。

这很简单;我认为我不必继续向您展示一个片段,但可以随意访问官方文档,在右侧显示“蜘蛛”继续向下滚动,直到您点击“爬行蜘蛛”它给出一些注意事项...

我的下一点:当你从你的初始部分开始时,你没有(或者更确切地说你没有)有一个从解析到部分细节的回调,这让我相信当你执行爬网时你不会过去第一页,除此之外,如果您正在尝试创建一个文本文件(或者您正在使用 OS 模块 2 写出一些东西,但您实际上并没有写任何东西)所以我对您为什么会感到非常困惑使用正确的功能而不是读取。

我的意思是,我自己在很多情况下都使用包含多个 URL 的外部文本文件或 CSV 文件,因此我不必将其粘贴在那里,但您显然是在写出或试图写入一个文件你说是管道?现在我更加困惑了!但重点是,我希望您很清楚这样一个事实,即如果您尝试创建文件或导出提取的项目,则可以选择导出和三种已预构建的格式,即 CSV JSON。但是正如您在回复我的评论时所说,如果您确实在使用管道和项目以及 Porter 实习生,您可以按照自己的意愿创建自己的导出格式,但如果它只是您需要的响应 URL,为什么要通过所有这么麻烦?

我的离别词是:再次阅读 Scrapy 的官方文档教程会很有帮助,并强调同时使用 settings.py 和 items.py 的重要性。

# -*- coding: utf-8 -*-
import scrapy
import os
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule
from quotes.items import QuotesItem

class QcrawlSpider(CrawlSpider):
    name = 'qCrawl'
    allowed_domains = ['quotes.toscrape.com']
    start_urls = ['http://quotes.toscrape.com/']

    rules = (
        Rule(LinkExtractor(allow=r'page/.*'), callback='parse_item', follow=True),
    )

    def parse_item(self, response):
    rurl = response.url
        item = QuotesItem()
        item['quote'] =response.css('span.text::text').extract()
        item['author'] = response.css('small.author::text').extract()
        item['rUrl'] = rurl
        yield item

    with open(os.path.abspath('') + '_' + "urllisr_" + '.txt', 'a') as a:
            a.write(''.join([rurl, '\n']))
            a.close()

当然,items.py 将由您在蜘蛛中看到的那些适当地填写,但是通过包含两个逐项列出的响应 URL,即使是默认的 Scrappy 方法 CSV 等,我也可以写出来,或者我可以创建自己的。

在这种情况下,它是一个简单的文本文件,但可能会变得非常狡猾;例如,如果您正确地写出它,那么您可以使用 OS 模块,例如,当我从视频托管站点创建 m3u 播放列表时,您可以使用自定义 CSV 项目导出器。但即使这样,然后使用自定义管道,我们也可以为您的 csvs 或您希望的任何内容编写自定义格式。

于 2017-10-05T02:18:24.233 回答