爬虫问题请教(scrapy + selenium)

2018-09-24 01:53:38 +08:00
 jqk

事情是这样的我在用 scrapy 根据关键词爬取新浪主页网站前 30 页内容,只能模拟浏览器点击下一页爬取,根据官方

文档把 selenium 相关操作写进了 middlewares.py 中,现在的问题是 middleware 获取到 response 传给

spider 解析。 现在的问题是,spider 只能解析 第一页,其后的页面 无法传个 spider 解析,代码如下:

middleware.py

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

Spier.py

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 不会变动,我现在需要获取每条内容所在的页码,但是每次只能解析第一页就终止,希望大家指点一下

2524 次点击
所在节点    Python
7 条回复
samzhuo
2018-09-24 03:04:56 +08:00
有可能是你第一页解析的时候出现错误导致无法进行下面的请求
dreasky
2018-09-24 13:09:54 +08:00
driver = webdriver.Chrome() 应该放在初始化的吧,process_request 里面生命周期
dreasky
2018-09-24 13:23:39 +08:00
另外如果 xpath 没错的话, 还要 wait 跳页结束才行.HtmlResponse 里面的 request.url 也应该是 driver.current_url 吧
jqk
2018-09-24 13:32:23 +08:00
@dreasky 试过了 request.url 和 driver.current_url 效果一样, 我的疑问是 spider 是不是只能解析 中间件发回的第一个 response, 比如我想要前 30 页的如果我把结果拼接然后回传给 spider 是可以的,但是这样我就获取不到 内容对应的页码了
NASHINIANSHAO
2018-09-27 08:29:19 +08:00
你这样写等于每一个请求都初始化一个 dirver,点击下一页,然后什么都不做,当然只解析第一页了啊,而且是解析了 30 次第一页
bug455
2018-09-27 10:39:36 +08:00
你这个 driver.page_source 获取方式错误了,这个只能获取页面 html 源码,你点击下一页,需要获取的是 DOM 结构,页面源码和 DOM 结构是不一样的。
ranlele
2018-09-27 16:10:23 +08:00
你这样每次都重新打开一次新的浏览器页面。可以通过再 Request 中设置 meta 信息。在 middlewares 中判断。在第一次请求时打开一次网页。再次请求时,直接执行浏览器模拟。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/492041

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX