我正在编写一个 Scrapy 抓取器,它使用 CrawlSpider 来抓取站点,查看其内部链接,并抓取任何外部链接(域与原始域不同的域的链接)的内容。
我设法用 2 条规则做到了这一点,但它们基于被抓取的站点的域。如果我想在多个网站上运行它,我会遇到一个问题,因为我不知道我目前在哪个“start_url”上,所以我无法适当地更改规则。
到目前为止,这是我想到的,它适用于一个网站,但我不确定如何将其应用于网站列表:
class HomepagesSpider(CrawlSpider):
name = 'homepages'
homepage = 'http://www.somesite.com'
start_urls = [homepage]
# strip http and www
domain = homepage.replace('http://', '').replace('https://', '').replace('www.', '')
domain = domain[:-1] if domain[-1] == '/' else domain
rules = (
Rule(LinkExtractor(allow_domains=(domain), deny_domains=()), callback='parse_internal', follow=True),
Rule(LinkExtractor(allow_domains=(), deny_domains=(domain)), callback='parse_external', follow=False),
)
def parse_internal(self, response):
# log internal page...
def parse_external(self, response):
# parse external page...
Run Code Online (Sandbox Code Playgroud)
这可能可以通过在调用刮刀时将 start_url 作为参数传递来完成,但我正在寻找一种在刮刀本身内以编程方式执行此操作的方法。
有任何想法吗?谢谢!
西蒙。
到目前为止对我来说还可以。我的问题是如何进一步抓取此URL列表?搜索后,我知道我可以在解析中返回一个请求,但似乎只能处理一个URL。
这是我的解析:
def parse(self, response):
# Get the list of URLs, for example:
list = ["http://a.com", "http://b.com", "http://c.com"]
return scrapy.Request(list[0])
# It works, but how can I continue b.com and c.com?
Run Code Online (Sandbox Code Playgroud)
我可以那样做吗?
def parse(self, response):
# Get the list of URLs, for example:
list = ["http://a.com", "http://b.com", "http://c.com"]
for link in list:
scrapy.Request(link)
# This is wrong, though I need something like this
Run Code Online (Sandbox Code Playgroud)
完整版本:
import scrapy
class MySpider(scrapy.Spider):
name = "mySpider"
allowed_domains = ["x.com"]
start_urls = ["http://x.com"]
def …Run Code Online (Sandbox Code Playgroud) 我想从多个网址抓取信息.我使用以下代码但它不起作用.愿有人请我指出我出错的地方吗?
import scrapy
class spider1(scrapy.Spider):
name = "spider1"
domain = "http://www.amazon.com/dp/"
ASIN = ['B01LA6171I', 'B00OUKHTLO','B00B7LUVZK']
def start_request(self):
for i in ASIN:
yield scrapy.Request(url=domain+i,callback = self.parse)
def parse(self, response):
title =response.css("span#productTitle::text").extract_first().strip()
ASIN_ext = response.xpath("//input[@name='ASIN']/@value").extract_first()
data = {"ASIN":ASIN_ext,"title":title,}
yield data
Run Code Online (Sandbox Code Playgroud) 我想在自定义基本蜘蛛类中具有一些针对蜘蛛的通用功能。
通常,y抓的蜘蛛从scrapy.Spider类继承。
我尝试在scrapy的spiders文件夹中创建BaseSpider类,但该类无效
import scrapy
class BaseSpider(scrapy.Spider):
def __init__(self):
super(scrapy.Spider).__init__()
def parse(self, response):
pass
Run Code Online (Sandbox Code Playgroud)
这是我真正的蜘蛛
import scrapy
import BaseSpider
class EbaySpider(BaseSpider):
name = "ebay"
allowed_domains = ["ebay.com"]
def __init__(self):
self.redis = Redis(host='redis', port=6379)
# rest of the spider code
Run Code Online (Sandbox Code Playgroud)
给出这个错误
TypeError: Error when calling the metaclass bases
module.__init__() takes at most 2 arguments (3 given)
Run Code Online (Sandbox Code Playgroud)
然后我尝试使用多重继承,使我的eBay Spider看起来像
class EbaySpider(scrapy.Spider, BaseSpider):
name = "ebay"
allowed_domains = ["ebay.com"]
def __init__(self):
self.redis = Redis(host='redis', port=6379)
# rest of the spider code …Run Code Online (Sandbox Code Playgroud) 我在python scrapy中编写了一个非常小的脚本来解析黄页网站上多个页面显示的名称,街道和电话号码.当我运行我的脚本时,我发现它运行顺利.但是,我遇到的唯一问题是数据在csv输出中被刮掉的方式.它总是两行之间的行(行)间隙.我的意思是:数据每隔一行打印一次.看到下面的图片,你就会明白我的意思.如果不是scrapy,我可以使用[newline =''].但是,不幸的是我在这里完全无助.如何摆脱csv输出中出现的空白行?提前谢谢你看看它.
items.py包括:
import scrapy
class YellowpageItem(scrapy.Item):
name = scrapy.Field()
street = scrapy.Field()
phone = scrapy.Field()
Run Code Online (Sandbox Code Playgroud)
这是蜘蛛:
import scrapy
class YellowpageSpider(scrapy.Spider):
name = "YellowpageSp"
start_urls = ["https://www.yellowpages.com/search?search_terms=Pizza&geo_location_terms=Los%20Angeles%2C%20CA&page={0}".format(page) for page in range(2,6)]
def parse(self, response):
for titles in response.css('div.info'):
name = titles.css('a.business-name span[itemprop=name]::text').extract_first()
street = titles.css('span.street-address::text').extract_first()
phone = titles.css('div[itemprop=telephone]::text').extract_first()
yield {'name': name, 'street': street, 'phone':phone}
Run Code Online (Sandbox Code Playgroud)
以下是csv输出的样子:
顺便说一句,我用来获取csv输出的命令是:
scrapy crawl YellowpageSp -o items.csv -t csv
Run Code Online (Sandbox Code Playgroud) 我正在使用scrapy刮掉一些大品牌来导入我网站的销售数据.目前我正在使用
DOWNLOAD_DELAY = 1.5
CONCURRENT_REQUESTS_PER_DOMAIN = 16
CONCURRENT_REQUESTS_PER_IP = 16
Run Code Online (Sandbox Code Playgroud)
我使用Item加载器指定css/xpath规则和Pipeline将数据写入csv.我收集的数据是原价,销售价格,颜色,尺寸,名称,图片网址和品牌.
我只为一个拥有大约10万网址的商家写了蜘蛛,这需要我大约4个小时.
我的问题是,对于10k网址,4小时听起来是否正常,或者它应该比这更快.如果是这样,我还需要做些什么来加快速度.
我只在本地使用一个SPLASH实例进行测试.但在生产中我计划使用3个SPLASH实例.
现在主要问题是,我有大约125个商家和每个平均10k产品.他们中的一对有超过150k的网址.
我需要每晚清理所有数据以更新我的网站.由于我的单个蜘蛛花了4个小时来刮掉10k网址,我想知道每晚实现125 x 10k网址是否真的是有效的梦想
我将非常感谢您对我的问题的经验输入.
我正在尝试使用 Scrapy 将篮球队的时间表保存到 CSV 文件中。我在这些文件中编写了以下代码:
设置.py
BOT_NAME = 'test_project'
SPIDER_MODULES = ['test_project.spiders']
NEWSPIDER_MODULE = 'test_project.spiders'
FEED_FORMAT = "csv"
FEED_URI = "cportboys.csv"
# Crawl responsibly by identifying yourself (and your website) on the user-agent
#USER_AGENT = 'test_project (+http://www.yourdomain.com)'
# Obey robots.txt rules
ROBOTSTXT_OBEY = True
Run Code Online (Sandbox Code Playgroud)
khsabot.py
import scrapy
class KhsaabotSpider(scrapy.Spider):
name = 'khsaabot'
allowed_domains = ['https://scoreboard.12dt.com/scoreboard/khsaa/kybbk17/?id=51978']
start_urls = ['http://https://scoreboard.12dt.com/scoreboard/khsaa/kybbk17/?id=51978/']
def parse(self, response):
date = response.css('.mdate::text').extract()
opponent = response.css('.opponent::text').extract()
place = response.css('.schedule-loc::text').extract()
for item in zip(date,opponent,place):
scraped_info = {
'date' : item[0], …Run Code Online (Sandbox Code Playgroud)