我对 Scrapy 很陌生,这是迄今为止我最复杂的蜘蛛。
import scrapy
from scrapy.selector import HtmlXPathSelector
class CocabotSpider(scrapy.Spider):
name = 'cocabot'
start_urls = ['https://www.tallahasseearts.org/event/?keyword&start_date&end_date&date_format=m-d-Y&term=400&event_location&save_lst_list&view']
custom_settings = {
'FEED_URI' : 'output/cocaoutput.json'
}
def parse(self, response):
# follow links to concert pages
for href in response.css("div.search-img a::attr(href)"):
yield response.follow(href, self.parse_concert)
# follow links to venue pages
for href in response.css("span.venue-event a::attr(href)"):
yield response.follow(href, self.parse_venue)
# follow links to pagination pages
for href in response.css("li a.next.page-numbers::attr(href)"):
yield response.follow(href, self.parse)
def parse_concert(self, response):
def extract_with_css(query):
return response.css(query).extract_first()
yield {
'headliner' : …Run Code Online (Sandbox Code Playgroud) 我目前正在使用 Scrapy 从不同网站抓取一些域,我想知道如何将数据保存在本地 json 文件中,格式为列表或字典,其中键为“domain”,域列表为值。
在爬虫文件中,该项是这样的:
item['domain'] = 'xxx'.extract()
yield item
import json
import codecs
class ChinazPipeline(object):
def __init__(self):
self.file = codecs.open('save.json', 'w', encoding='utf-8')
def process_item(self, item, spider):
line = json.dumps(dict(item), ensure_ascii=False) + "\n"
self.file.write(line)
return item
Run Code Online (Sandbox Code Playgroud)
我期望的是:
{"domain": "['google.com', 'cnn.com', 'yahoo.com']"}
Run Code Online (Sandbox Code Playgroud)
或者只是将我爬取的所有域保存为 json 中的列表,两种方式都适合我。
我是 scrapy 和splash 的新手,我需要从单页和常规网络应用程序中抓取数据。
不过,需要注意的是,我主要是从内部工具和应用程序中抓取数据,因此有些需要身份验证,并且所有这些都需要在页面完全加载之前至少几秒钟的加载时间。
我天真地尝试了Python time.sleep(秒),但它不起作用。基本上,SplashRequest 和 scrapy.Request 似乎都运行并产生结果。然后,我了解了 LUA 脚本作为这些请求的参数,并尝试使用各种形式的 wait() 编写 LUA 脚本,但看起来这些请求从未真正运行过 LUA 脚本。它立即完成,但我的 HTMl 选择器没有找到我要查找的任何内容。
我按照这里的指示https://github.com/scrapy-plugins/scrapy-splash,并让他们的 docker 实例在 localhost:8050 上运行并创建了一个 settings.py。
这里有经验的人知道我可能会错过什么吗?
谢谢!
蜘蛛.py
# -*- coding: utf-8 -*-
import scrapy
from scrapy.linkextractors import LinkExtractor
from scrapy_splash import SplashRequest
import logging
import base64
import time
# from selenium import webdriver
# lua_script="""
# function main(splash)
# splash:set_user_agent(splash.args.ua)
# assert(splash:go(splash.args.url))
# splash:wait(5)
# -- requires Splash 2.3
# -- while not splash:select('#user-form') do …Run Code Online (Sandbox Code Playgroud) 目标:我想检索特定电子商务网站上发布的订单绩效数据。由于每个订单绩效的这些数据分布在多个页面上,因此我们希望提取每个页面的信息,并最终将它们汇总为单个项目或记录。
\n我浏览了官方文档和其他类似的质量检查并找到了一些。\n从这些信息中,我了解到可以通过使用 cb_kwargs 来实现这一目标。\n但是,我无法理解什么下面的代码是错误的。
\n[python - 使用 scrapy 解释回调和 cb_kwargs - 堆栈\n溢出]\n(使用 scrapy 解释回调和 cb_kwargs)
\n[python - Scrapy 中每个项目有多个页面。\n(/sf/ask/1554131351/?noredirect=1&lq=1)
\n程序运行,但 csv 不输出任何内容,如下图所示。\n在此处输入图像描述
\n订单结果页面每页包含 30 个商品的信息。\n我想首先检索每个商品的所有注册日期(仅在第一页上列出),然后从那里移至每个产品页面以检索详细信息,然后然后一次将这些信息存储一项。
\n我是一个初学者,3个月前开始用Python编写代码。\n所以我可能对类等的基本理解存在一些问题。\n如果你能在我们讨论时向我指出这一点,我将不胜感激。\n官方文档scrapy对初学者来说太不友好了,我很难用它。
\n def parse_firstpage_item(self, response): \n request = scrapy.Request(\n url=response.url,\n callback=self.parse_productpage_item,\n cb_kwargs=dict(product_URL=\'//*[@id="buyeritemtable"]/div/ul/li[2]/p[1]/a\'))\n \n loader = ItemLoader(item = BuymaResearchtoolItem(), response = response)\n \n loader.add_xpath("Conversion_date", \'//*[@id="buyeritemtable"]/div/ul/li[2]/p[3]/text()\')\n \n yield loader.load_item()\n \n \n def parse_productpage_item(self, response, product_URL): \n \n loader = ItemLoader(item = BuymaResearchtoolItem(), response …Run Code Online (Sandbox Code Playgroud) 我正在检查一堆网站响应状态并将它们导出到 CSV 文件。有几个网站没有找到网站DNSLookupError,也没有在 CSV 文件中存储任何内容。如何将消息与 URL 一起存储到 CSV 中?DNSLookupError
def parse(self, response):
yield {
'URL': response.url,
'Status': response.status
}
Run Code Online (Sandbox Code Playgroud) 尝试从 BGG 中抓取项目的数据,但在第 20 页之后,您需要登录。我正在遵循本指南,并查看了其他一些使用 Scrapy 的人,但这是在他们实现特定页面的登录之前。我似乎不知道如何让 Scrapy 的请求功能发挥作用。
我正在尝试在Spider( https://docs.scrapy.org/en/latest/topics/request-response.html )中使用Scrapy的[Requests and FormRequest.from_response],如下所示:
class BGGSpider(Spider):
name = "bgg"
headers = {'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64; rv:48.0) Gecko/20100101 Firefox/48.0'}
def start_requests(self):
yield scrapy.Request(
url='https://boardgamegeek.com/login/',
callback=self.login
)
def login(self, response):
return scrapy.FormRequest.from_response(
response,
formdata = {
'username': 'myname',
'password': 'mypassword',
},
callback=self.parse
)
def parse(self, response):
url = "https://www.boardgamegeek.com/browse/boardgame/page/"
for index in range(1):
yield Request(url=url+str(index+1), callback=self.parse_deeper, headers=self.headers, dont_filter=True)
Run Code Online (Sandbox Code Playgroud)
它返回“ raise ValueError(f“在 {response} 中找不到元素”) ValueError:在 <200 https://boardgamegeek.com:443/login> 中找不到元素”
但我检查了登录门户 …
由于到目前为止没有任何工作,我开始了一个新的项目
python scrapy-ctl.py startproject Nu
Run Code Online (Sandbox Code Playgroud)
我完全按照教程,创建了文件夹和一个新的蜘蛛
from scrapy.contrib.spiders import CrawlSpider, Rule
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor
from scrapy.selector import HtmlXPathSelector
from scrapy.item import Item
from Nu.items import NuItem
from urls import u
class NuSpider(CrawlSpider):
domain_name = "wcase"
start_urls = ['http://www.whitecase.com/aabbas/']
names = hxs.select('//td[@class="altRow"][1]/a/@href').re('/.a\w+')
u = names.pop()
rules = (Rule(SgmlLinkExtractor(allow=(u, )), callback='parse_item'),)
def parse(self, response):
self.log('Hi, this is an item page! %s' % response.url)
hxs = HtmlXPathSelector(response)
item = Item()
item['school'] = hxs.select('//td[@class="mainColumnTDa"]').re('(?<=(JD,\s))(.*?)(\d+)')
return item
SPIDER = NuSpider()
Run Code Online (Sandbox Code Playgroud)
当我跑
C:\Python26\Scripts\Nu>python scrapy-ctl.py crawl …Run Code Online (Sandbox Code Playgroud) 我想制作一个新的投注工具,但我需要一个赔率和结果的数据库,但在网络上找不到任何东西.我发现这个网站有很棒的存档:OddsPortal
我想做的就是从上面的页面中抓取结果和赔率.我发现一个名为Scrapy的工具可以做到,是真的吗?有人可以帮我提一些提示吗?
出于某种原因,我的Scrapy蜘蛛抛出一个错误,这与输出混淆,即使我使用条件语句来防止这种情况.
脚本
import scrapy
class AmazonSpider(scrapy.Spider):
name = 'amazon'
def start_requests(self):
pages = ['https://www.amazon.ca/electronics-deals-electronics-sale-tv-sale/b/ref=sv_ce_0?ie=UTF8&node=2055586011']
yield scrapy.Request(url=pages[0], callback=self.parse)
def parse(self, response):
if response.status != 404:
cont_path = '//div[@class="a-row a-spacing-none"]/span[@class="a-size-small a-color-secondary a-text-strike"]/ancestor::div[@class="s-item-container"]'
cont_resp = response.xpath(cont_path).extract()
for idx in range(1, len(cont_resp)+1):
thrd_path = '(//div[@class="a-row a-spacing-none"]/span[@class="a-size-small a-color-secondary a-text-strike"]/ancestor::div[@class="s-item-container"])[' + str(idx) + ']/div[@class="a-row a-spacing-mini"][2]/div[4]/a/span[2]/text()'
thrd_resp = response.xpath(thrd_path).extract_first()
### i have also tried:
# != None
# and hasattr(thrd_resp, 'split')
if thrd_resp is not None:
obj['thrd_resp'] = float(pric_resp.split()[1])
###
yield obj
Run Code Online (Sandbox Code Playgroud)
日志
AttributeError: 'NoneType' object has …
scrapy ×10
python ×8
python-3.x ×2
web-crawler ×2
web-scraping ×2
database ×1
java ×1
json ×1
lua ×1
python-2.7 ×1