问题描述
登录到我自己的帐户后,我试图从stackoverflow网站上删除问题和发布日期。这是为了练习带有飞溅的刮擦。
成功登录帐户后,我可以访问问题页面。但是,我在数据提取过程中陷入困境。我已经使用抓取蜘蛛来管理提取,但是它抛出了错误:
NotImplementedError:未定义StackdataSpider.parse回调
这是我到目前为止的进展:
import scrapy
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider,Rule
from scrapy_splash import SplashRequest
from scrapy.utils.response import open_in_browser
#docker run -it -p 8050:8050 --rm scrapinghub/splash
class StackdataSpider(CrawlSpider):
name = 'stackData'
allowed_domains = ['stackoverflow.com']
user_agent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML,like Gecko) Chrome/86.0.4240.75 Safari/537.36"
script='''
function main(splash,args)
splash.private_mode_enabled = false
url=args.url
assert(splash:go(url))
splash:set_viewport_full()
assert(splash:wait(1))
email_Box = assert(splash:select("#email"))
email_Box:focus()
email_Box:send_text("test@test.com")
assert(splash:wait(1))
password_Box = assert(splash:select("#password"))
password_Box:focus()
password_Box:send_text("testpassword")
assert(splash:wait(1))
submit_button = assert(splash:select("#submit-button"))
submit_button:mouse_click()
assert(splash:wait(5))
user_profile = assert(splash:select("a[href $='gopal-kisi']"))
user_profile:mouse_click()
assert(splash:wait(5))
questions_summary = assert(splash:select("a[href $='tab=questions']"))
questions_summary:mouse_click()
assert(splash:wait(5))
return splash:html()
end
'''
def start_requests(self):
yield SplashRequest(
url="https://stackoverflow.com/users/login",headers={
'User-Agent':self.user_agent
},callback=self.parse,endpoint="execute",args={
'lua_source':self.script
}
)
rules = (
Rule(LinkExtractor(restrict_xpaths="//a[@class='question-hyperlink']"),callback='parse_item',follow=True,process_request="set_user_agent"),)
def set_user_agent(self,request):
request.headers['User-Agent']=self.user_agent
return request
def parse_item(self,response):
yield {
'questions':response.xpath("//a[@class='question-hyperlink']/text()").get(),'asked_date':response.xpath("(//span[@class='relativetime'])[1]/text()").get()
}
根据到目前为止的经验,当我们使用start_requests函数时,不需要使用parse函数。但是,如果我重命名要解析的parse_item,它将仅提取一个问题而没有任何错误。
这是错误的,因为它破坏了爬网蜘蛛,并从初始页面给出的响应页面中给出结果。我不想要那个。
我认为,这是使用scrapspider引发的问题,但是我不确定,即使我的猜测是正确的,我也不知道这是什么以及如何解决。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)