嗨我试着在我的代码中实现这个.但是我收到以下错误: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) 随着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)
如果每个项目实例确实都有链接值(尽管是空字符串),为什么我不能访问此密钥?
我有一个很大的相对 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_page2在start_requests完成所有初始请求之前不会调用它。有什么方法可以让 Scrapy 更早地开始调用回调吗?最终,我不想在开始看到项目流过管道之前等待一百万个请求。
我有一个处理链中请求的蜘蛛,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) 我正在从另一个脚本运行爬虫蜘蛛,我需要从 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的新手,也是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
我尝试使用ScrapyFileLogObserver测试scrapy日志.在我的源代码中,我正确设置了要使用的包:
来自scrapy.log导入ScrapyFileLogObserver
但是当我启动我的蜘蛛时,我遇到了这个错误:
来自scrapy.log导入ScrapyFileLogObserver
ImportError:无法导入名称ScrapyFileLogObserver
作为信息,我使用scrapy的最新版本(Scrapy 1.0.1).我如何解决我的错误?
我是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)
这有什么缺失?
我试图让这个蜘蛛工作,如果要求分别刮下它的组件,它可以工作,但是当我尝试使用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) scrapy ×10
scrapy-spider ×10
python ×9
web-scraping ×5
web-crawler ×3
key ×1
list ×1
python-2.7 ×1
twisted ×1
xpath ×1