标签: scrapy-spider

在scrapy网络爬虫中获取错误

嗨我试着在我的代码中实现这个.但是我收到以下错误:exceptions.NameError: global name 'Request' is not defined.

from scrapy.spider import BaseSpider
from scrapy.selector import HtmlXPathSelector 
from bs4 import BeautifulSoup

class spider_aicte(BaseSpider):
    name = "Indian_Colleges"
    allowed_domains = ["http://www.domain.org"]
    start_urls = [
        "http://www.domain.org/appwebsite.html",
        ]

    def parse(self, response):
        filename = response.url.split("/")[-2]
        soup = BeautifulSoup(response.body)
        for link in soup.find_all('a'):
            download_link = link.get('href')
            if '.pdf' in download_link:
                pdf_link = "http://www.domain.org" + download_link
                print pdf_link
                class FileSpider(BaseSpider):
                    name = "fspider"
                    allowed_domains = ["www.domain.org"]
                    start_urls = [
                            pdf_link
                            ]
        for url in pdf_link:
            yield Request(url, …
Run Code Online (Sandbox Code Playgroud)

python web-crawler scrapy web-scraping scrapy-spider

4
推荐指数
1
解决办法
7389
查看次数

Scrapy:如果密钥存在,为什么我会得到KeyError?

随着items.py定义:

import scrapy 

class CraigslistSampleItem(scrapy.Item):
    title = scrapy.Field()
    link = scrapy.Field()
Run Code Online (Sandbox Code Playgroud)

并通过蜘蛛填充每个项目:

item = CraigslistSampleItem()
item["title"] = $someXpath.extract() 
item["link"] = $someOtherXpath.extract()
Run Code Online (Sandbox Code Playgroud)

当我将这些附加到列表(由parse()返回)并将其存储为例如csv时,我得到两列数据,标题链接,如预期的那样.如果我注释掉XPath的链接并存储为csv,我仍然会得到两列数据,链接列中的值为空字符串.这似乎是合理的,因为title和link都是每个CraigslistSampleItem类的属性.那么,我认为我可以做这样的事情(XPath for link仍然被注释掉):

  if item["link"] == '':
      print "link has not been given a value"
Run Code Online (Sandbox Code Playgroud)

然而,尝试获取每个项目的链接属性失败了:

File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/scrapy/item.py", line 50, in __getitem__
    return self._values[key]
exceptions.KeyError: 'link'
Run Code Online (Sandbox Code Playgroud)

如果每个项目实例确实都有链接值(尽管是空字符串),为什么我不能访问此密钥?

python key list scrapy scrapy-spider

4
推荐指数
1
解决办法
3513
查看次数

如何让 Scrapy 在 start_requests 方法完成之前执行回调?

我有一个很大的相对 url 文件,我想用 Scrapy 抓取它,我已经编写了一些代码来逐行读取这个文件,并为我的蜘蛛构建请求进行解析。下面是一些示例代码。

蜘蛛:

def start_requests(self):
    with open(self._file) as infile:
        for line in infile:
            inlist = line.replace("\n","").split(",")
            item = MyItem(data = inlist[0])

            request = scrapy.Request(
                url = "http://foo.org/{0}".format(item["data"]),
                callback = self.parse_some_page
            )
            request.meta["item"]
            yield request


def parse_some_page(self,response):
    ...
    request = scrapy.Request(
        url = "http://foo.org/bar",
        callback = self.parse_some_page2
    )
    yield request
Run Code Online (Sandbox Code Playgroud)

这工作正常,但对于一个大的输入文件,我看到parse_some_page2start_requests完成所有初始请求之前不会调用它。有什么方法可以让 Scrapy 更早地开始调用回调吗?最终,我不想在开始看到项目流过管道之前等待一百万个请求。

twisted scrapy scrapy-spider

4
推荐指数
1
解决办法
4026
查看次数

Scrapy蜘蛛没有收到spider_idle信号

我有一个处理链中请求的蜘蛛,meta用于产生具有来自多个请求的数据的项目。我用来生成请求的方式是在第一次调用 parse 函数时启动所有请求,但是,如果我有太多链接要请求,则不会安排所有请求,并且最终我没有得到我需要的一切。

为了解决这个问题,我试图让蜘蛛一次请求 5 个产品,当蜘蛛空闲时再次请求(通过在 中连接信号from_crawler)。问题是,由于我的代码现在是,spider_idle 不运行该request函数并且蜘蛛立即关闭。就好像蜘蛛没有闲着一样。

这是一些代码:

class ProductSpider(scrapy.Spider):
    def __init__(self, *args, **kwargs):
        super(ProductSpider, self).__init__(*args, **kwargs)
        self.parsed_data = []
        self.header = {}
        f = open('file.csv', 'r')
        f_data = [[x.strip()] for x in f]
        count=1
        first = 'smth'
        for product in f_data:
            if first != '':
                header = product[0].split(';')
                for each in range(len(header[1:])):
                    self.header[header[each+1]] = each+1
                first = ''
            else:
                product = product[0].split(';')
                product.append(count)
                count+=1
                self.parsed_data.append(product)
        f.close()

    @classmethod
    def from_crawler(cls, crawler, *args, **kwargs): …
Run Code Online (Sandbox Code Playgroud)

python web-crawler scrapy web-scraping scrapy-spider

4
推荐指数
1
解决办法
676
查看次数

无法从 scrapy.CrawlerProcess 获取 Scrapy Stats

我正在从另一个脚本运行爬虫蜘蛛,我需要从 Crawler 检索并保存到变量统计信息。我已经查看了文档和其他 StackOverflow 问题,但我无法解决这个问题。

这是我运行爬行的脚本:

import scrapy
from scrapy.crawler import CrawlerProcess


process = CrawlerProcess({})
process.crawl(spiders.MySpider)
process.start()

stats = CrawlerProcess.stats.getstats() # I need something like this
Run Code Online (Sandbox Code Playgroud)

我希望 stats 包含这条数据(scrapy.statscollectors):

     {'downloader/request_bytes': 44216,
     'downloader/request_count': 36,
     'downloader/request_method_count/GET': 36,
     'downloader/response_bytes': 1061929,
     'downloader/response_count': 36,
     'downloader/response_status_count/200': 36,
     'finish_reason': 'finished',
     'finish_time': datetime.datetime(2018, 11, 9, 16, 31, 2, 382546),
     'log_count/DEBUG': 37,
     'log_count/ERROR': 35,
     'log_count/INFO': 9,
     'memusage/max': 62623744,
     'memusage/startup': 62623744,
     'request_depth_max': 1,
     'response_received_count': 36,
     'scheduler/dequeued': 36,
     'scheduler/dequeued/memory': 36,
     'scheduler/enqueued': 36,
     'scheduler/enqueued/memory': 36,
     'start_time': datetime.datetime(2018, 11, 9, 16, 30, 38, …
Run Code Online (Sandbox Code Playgroud)

python web-crawler scrapy web-scraping scrapy-spider

4
推荐指数
1
解决办法
1057
查看次数

将Scrapy Spider传递给要通过.txt文件进行爬网的URL列表

我是Python的新手,也是Scrapy的新手.

我已经设置了一个蜘蛛来抓取并提取我需要的所有信息.但是,我需要将.txt文件的URL传递给start_urls变量.

例如:

class LinkChecker(BaseSpider):
    name = 'linkchecker'
    start_urls = [] #Here I want the list to start crawling a list of urls from a text file a pass via the command line.
Run Code Online (Sandbox Code Playgroud)

我做了一些研究,并且空手而归.我已经看过这种类型的示例(如何在scrapy spider中传递用户定义的参数),但我认为这不适用于传递文本文件.

python command-line-arguments scrapy web-scraping scrapy-spider

3
推荐指数
1
解决办法
1万
查看次数

Scrapy:收集重试消息

爬行器有一个最大化次数,如此处所述.达到该目标后,我收到类似于以下内容的错误:

Gave up retrying <GET https:/foo/bar/123> (failed 3 times)

我相信消息是由代码产生在这里.

但是,我想做一些关于放弃的事情.具体来说,我想知道是否有可能:

  1. 提取123URL 的部分(ID)并将这些ID正确地写入单独的文件中.
  2. 访问meta原始信息request.本文档可能会有所帮助.

python scrapy scrapy-spider

3
推荐指数
1
解决办法
990
查看次数

ImportError:无法导入名称ScrapyFileLogObserver

我尝试使用ScrapyFileLogObserver测试scrapy日志.在我的源代码中,我正确设置了要使用的包:

来自scrapy.log导入ScrapyFileLogObserver

但是当我启动我的蜘蛛时,我遇到了这个错误:

来自scrapy.log导入ScrapyFileLogObserver

ImportError:无法导入名称ScrapyFileLogObserver

作为信息,我使用scrapy的最新版本(Scrapy 1.0.1).我如何解决我的错误?

python scrapy web-scraping python-2.7 scrapy-spider

3
推荐指数
1
解决办法
676
查看次数

我得到一个AttributeError:'HtmlResponse'对象在scrapy中没有属性'xpath'

我是scrapy的新手,我正在使用Scrapy 0.14.4.我只想按照以下示例打印标题和链接.

这是我的蜘蛛:

from scrapy.spider import BaseSpider

class XxxSpider(BaseSpider):
    name = "xxx"
    allow_domains = ["xxx.xxx.xxx"]
    start_urls = ["http://xxx.xxx.com/jobs/"]


    def parse(self, response):
        for sel in response.xpath("//div[@id='job_listings']/a"):
            title = sel.xpath('./text()').extract()
            link = sel.xpath('./@href').extract()
            print title, link
Run Code Online (Sandbox Code Playgroud)

这有什么缺失?

python xpath scrapy scrapy-spider

3
推荐指数
1
解决办法
4737
查看次数

使用Scrapy将参数传递给回调函数,因此可以在以后接收参数崩溃

我试图让这个蜘蛛工作,如果要求分别刮下它的组件,它可以工作,但是当我尝试使用Srapy回调函数来接收参数后,我会崩溃.目标是在输出json文件中以格式写入时抓取多个页面并刮取数据:

作者| 专辑| 标题| 歌词

每个数据都位于不同的网页上,这就是我为什么要使用Scrapy回调函数来实现这一目标的原因.

此外,上述每个项目都在Scrapy items.py下定义为:

import scrapy

class TutorialItem(scrapy.Item):
# define the fields for your item here like:
# name = scrapy.Field()
    author = scrapy.Field()
    album = scrapy.Field()
    title = scrapy.Field()
    lyrics = scrapy.Field()
Run Code Online (Sandbox Code Playgroud)

蜘蛛代码从这里开始:

import scrapy
import re
import json

from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule
from tutorial.items import TutorialItem


# urls class
class DomainSpider(scrapy.Spider):
    name = "domainspider"
    allowed_domains = ['www.domain.com']
    start_urls = [
        'http://www.domain.com',
    ]

    rules = (
        Rule(LinkExtractor(allow='www\.domain\.com/[A-Z][a-zA-Z_/]+$'), 
            'parse', follow=True,
        ), …
Run Code Online (Sandbox Code Playgroud)

python scrapy scrapy-spider

3
推荐指数
1
解决办法
1717
查看次数