事情是这样的我在用 scrapy 根据关键词爬取新浪主页网站前 30 页内容,只能模拟浏览器点击下一页爬取,根据官方
文档把 selenium 相关操作写进了 middlewares.py 中,现在的问题是 middleware 获取到 response 传给
spider 解析。 现在的问题是,spider 只能解析 第一页,其后的页面 无法传个 spider 解析,代码如下:
class SeleniumMiddleware(object):
def process_request(self,request,spider):
if spider_name == 'sina':
driver = webdriver.Chrome()
driver.get(request.url)
next_page = driver.find_element_by_xpath('//a[contains(text(),'下一页’)]")
next_page.click()
return HtmlResponse(request.url, body=driver.page_source,request=requst)
esle:
return
class Sina(scrapy.Spider):
def start_request(self):
keyword_list = ['a','b','c']
max_page = 30
for k in keyword_list:
for p in range(1,max_page+1):
url = base_url.format(k)
yield scrapy.Request(url=url, callback=self.parse)
点击下一页 url 不会变动,我现在需要获取每条内容所在的页码,但是每次只能解析第一页就终止,希望大家指点一下
1
samzhuo 2018-09-24 03:04:56 +08:00 2
有可能是你第一页解析的时候出现错误导致无法进行下面的请求
|
2
dreasky 2018-09-24 13:09:54 +08:00
driver = webdriver.Chrome() 应该放在初始化的吧,process_request 里面生命周期
|
3
dreasky 2018-09-24 13:23:39 +08:00
另外如果 xpath 没错的话, 还要 wait 跳页结束才行.HtmlResponse 里面的 request.url 也应该是 driver.current_url 吧
|
4
jqk OP @dreasky 试过了 request.url 和 driver.current_url 效果一样, 我的疑问是 spider 是不是只能解析 中间件发回的第一个 response, 比如我想要前 30 页的如果我把结果拼接然后回传给 spider 是可以的,但是这样我就获取不到 内容对应的页码了
|
5
NASHINIANSHAO 2018-09-27 08:29:19 +08:00
你这样写等于每一个请求都初始化一个 dirver,点击下一页,然后什么都不做,当然只解析第一页了啊,而且是解析了 30 次第一页
|
6
bug455 2018-09-27 10:39:36 +08:00
你这个 driver.page_source 获取方式错误了,这个只能获取页面 html 源码,你点击下一页,需要获取的是 DOM 结构,页面源码和 DOM 结构是不一样的。
|
7
ranlele 2018-09-27 16:10:23 +08:00
你这样每次都重新打开一次新的浏览器页面。可以通过再 Request 中设置 meta 信息。在 middlewares 中判断。在第一次请求时打开一次网页。再次请求时,直接执行浏览器模拟。
|