V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
jqk
V2EX  ›  Python

爬虫问题请教(scrapy + selenium)

  •  1
     
  •   jqk · 2018-09-24 01:53:38 +08:00 · 2352 次点击
    这是一个创建于 2012 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    7 条回复    2018-09-27 16:10:23 +08:00
    samzhuo
        1
    samzhuo  
       2018-09-24 03:04:56 +08:00   ❤️ 2
    有可能是你第一页解析的时候出现错误导致无法进行下面的请求
    dreasky
        2
    dreasky  
       2018-09-24 13:09:54 +08:00
    driver = webdriver.Chrome() 应该放在初始化的吧,process_request 里面生命周期
    dreasky
        3
    dreasky  
       2018-09-24 13:23:39 +08:00
    另外如果 xpath 没错的话, 还要 wait 跳页结束才行.HtmlResponse 里面的 request.url 也应该是 driver.current_url 吧
    jqk
        4
    jqk  
    OP
       2018-09-24 13:32:23 +08:00
    @dreasky 试过了 request.url 和 driver.current_url 效果一样, 我的疑问是 spider 是不是只能解析 中间件发回的第一个 response, 比如我想要前 30 页的如果我把结果拼接然后回传给 spider 是可以的,但是这样我就获取不到 内容对应的页码了
    NASHINIANSHAO
        5
    NASHINIANSHAO  
       2018-09-27 08:29:19 +08:00
    你这样写等于每一个请求都初始化一个 dirver,点击下一页,然后什么都不做,当然只解析第一页了啊,而且是解析了 30 次第一页
    bug455
        6
    bug455  
       2018-09-27 10:39:36 +08:00
    你这个 driver.page_source 获取方式错误了,这个只能获取页面 html 源码,你点击下一页,需要获取的是 DOM 结构,页面源码和 DOM 结构是不一样的。
    ranlele
        7
    ranlele  
       2018-09-27 16:10:23 +08:00
    你这样每次都重新打开一次新的浏览器页面。可以通过再 Request 中设置 meta 信息。在 middlewares 中判断。在第一次请求时打开一次网页。再次请求时,直接执行浏览器模拟。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1361 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 17:42 · PVG 01:42 · LAX 10:42 · JFK 13:42
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.