我可以选择该项目并在Webdriver上检索信息。但是我不知道如何将响应URL传递给crawlspider。
driver = webdriver.Firefox()
driver.get('http://www.cppcc.gov.cn/CMS/icms/project1/cppcc/wylibary/wjWeiYuanList.jsp')
more_btn = WebDriverWait(driver, 20).until(
EC.visibility_of_element_located((By.ID, '_button_select'))
)
more_btn.click()
## select specific value from the dropdown
driver.find_element_by_css_selector("select#tabJcwyxt_jiebie > option[value='teyaoxgrs']").click()
driver.find_element_by_css_selector("select#tabJcwyxt_jieci > option[value='d11jie']").click()
search2 = driver.find_element_by_class_name('input_a2')
search2.click()
time.sleep(5)
## convert html to "nice format"
text_html=driver.page_source.encode('utf-8')
html_str=str(text_html)
## this is a hack that initiates a "TextResponse" object (taken from the Scrapy module)
resp_for_scrapy=TextResponse('none',200,{},html_str,[],None)
## convert html to "nice format"
text_html=driver.page_source.encode('utf-8')
html_str=str(text_html)
resp_for_scrapy=TextResponse('none',200,{},html_str,[],None)
所以这就是我被困住的地方。我能够使用上面的代码进行查询。但是,如何将resp_for_scrapy传递给crawlspider?我把resp_for_scrapy代替了item,但这没用。
## spider
class ProfileSpider(CrawlSpider):
name = 'pccprofile2'
allowed_domains = ['cppcc.gov.cn']
start_urls = ['http://www.cppcc.gov.cn/CMS/icms/project1/cppcc/wylibary/wjWeiYuanList.jsp']
def parse(self, resp_for_scrapy):
hxs = HtmlXPathSelector(resp_for_scrapy)
for post in resp_for_scrapy.xpath('//div[@class="table"]//ul//li'):
items = []
item = Ppcprofile2Item()
item ["name"] = hxs.select("//h1/text()").extract()
item ["title"] = hxs.select("//div[@id='contentbody']//tr//td//text()").extract()
items.append(item)
##click next page
while True:
next = self.driver.findElement(By.linkText("下一页"))
try:
next.click()
except:
break
return(items)
任何建议将不胜感激!!!!
编辑我包括一个中间件类,可从Spider类之前的下拉列表中进行选择。但是现在没有错误,也没有结果。
class JSMiddleware(object):
def process_request(self, request, spider):
driver = webdriver.PhantomJS()
driver.get('http://www.cppcc.gov.cn/CMS/icms/project1/cppcc/wylibary/wjWeiYuanList.jsp')
# select from the dropdown
more_btn = WebDriverWait(driver, 20).until(
EC.visibility_of_element_located((By.ID, '_button_select'))
)
more_btn.click()
driver.find_element_by_css_selector("select#tabJcwyxt_jiebie > option[value='teyaoxgrs']").click()
driver.find_element_by_css_selector("select#tabJcwyxt_jieci > option[value='d11jie']").click()
search2 = driver.find_element_by_class_name('input_a2')
search2.click()
time.sleep(5)
#get the response
body = driver.page_source
return HtmlResponse(driver.current_url, body=body, encoding='utf-8', request=request)
class ProfileSpider(CrawlSpider):
name = 'pccprofile2'
rules = [Rule(SgmlLinkExtractor(allow=(),restrict_xpaths=("//div[@class='table']")), callback='parse_item')]
def parse_item(self, response):
hxs = HtmlXPathSelector(response)
items = []
item = Ppcprofile2Item()
item ["name"] = hxs.select("//h1/text()").extract()
item ["title"] = hxs.select("//div[@id='contentbody']//tr//td//text()").extract()
items.append(item)
下载器中间件是一个挂钩Scrapy的请求/响应处理的框架。这是一个轻量级的低级系统,用于全局更改Scrapy的请求和响应。
这是一个使用PhantomJS的非常基本的示例:
from scrapy.http import HtmlResponse
from selenium import webdriver
class JSMiddleware(object):
def process_request(self, request, spider):
driver = webdriver.PhantomJS()
driver.get(request.url)
body = driver.page_source
return HtmlResponse(driver.current_url, body=body, encoding='utf-8', request=request)
一旦返回HtmlResponse(或者TextResponse如果你真正想要的是),Scrapy将停止处理下载程序,并使用Spider的parse方法:
如果它返回一个Response
对象,那么Scrapy不会费心调用任何其他process_request()或process_exception()方法或适当的下载函数。它将返回该响应。始终在每个响应上调用已安装中间件的process_response()方法。
在这种情况下,parse
除了页面上的JS已经执行之外,你可以继续像平常使用HTML一样继续使用Spider的方法。
提示:由于Downloader Middleware的process_request
方法接受Spider作为参数,因此你可以在Spider中添加一个条件来检查是否需要处理JS,这将使你能够以完全相同的方式处理JS和非JS页面spider。
问题内容: 我正在学习Python,并尝试在下拉菜单上将该页面抓取为特定值。之后,我需要单击结果表上的每个项目以检索特定信息。我可以选择该项目并在网络驱动程序上检索信息。但是我不知道如何将响应URL传递给crawlspider。 这就是我被困住的地方。我能够使用上面的代码进行查询。但是,如何将 resp_for_scrapy 传递给 crawlspider ?我把 resp_for_scrapy
问题内容: 我正在学习Python,并尝试在下拉菜单上将该页面抓取为特定值。之后,我需要单击结果表上的每个项目以检索特定信息。我可以选择该项目并在网络驱动程序上检索信息。但是我不知道如何将响应URL传递给crawlspider。 这就是我被困住的地方。我能够使用上面的代码进行查询。但是,如何将 resp_for_scrapy 传递给 crawlspider ?我把 resp_for_scrapy
My mainactivity.xml:包括一个textview和ListView。 我的问题是如何使用ArrayAdapter将响应从volley传递到listview?
问题内容: 我需要Selenium才能完成javascript工作。 首先,我使用Scrapy登录,然后需要使用Selenium 打开。 问题在于Selenium没有cookie,因此它打开了登录页面。 有谁知道我该如何从曲奇到selenium传递曲奇? 问题答案: 由于您到目前为止还没有提供您编写的任何代码,因此我仅介绍您。 为了从Scrapy获取cookie,请查看和方法 为了设置硒驱动程序的
我如何将值从空手道API传递到Java类? 正如文档中提到的,我使用了以下代码段从Java API获取响应。但它返回带有未格式化的JSON内容的响应。 然后,我使用以下脚本打印响应。 多谢了。
问题内容: 我一直试图获得一个快速应用程序,以流形式发送响应。 当我将“ rs.pipe(res)”替换为“ rs.pipe(process.stdout)”时,它会在控制台中打印,但是如何使其在快速应用程序中工作。 问题答案: 您不需要可读的流实例,只需使用: 之所以可行,是因为在Express中,它基于Node自己的,因此它继承了其所有方法(如)。