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
saximi
V2EX  ›  Python

请问一个关于爬虫的问题

  •  
  •   saximi · 2017-09-22 21:04:09 +08:00 · 2554 次点击
    这是一个创建于 2645 天前的主题,其中的信息可能已经有所发展或是发生改变。
    在爬取某网站时,要根据页面上的选择页控件接着爬取下一个页面,但是控件中下一页的网址并没有直接给出来,而是形如这样的源码:3  其中的 queryListByPage 应该是点击“ 3 ”这个页码的方框时会触发的函数。我想用 selenium.webdriver 和 PhantomJS 来模拟点击页码并进入下一页面的动作,我写了如下的语句: 
    nextpageButton = driver.find_element_by_name(response.xpath('a/@click').extract()) 
    nextpageButton.click() 
    
    我面临的问题如下: 
    1、上面的语句是否可以实现模拟点击下一页页码按钮的效果 
    2、如果上面语句可以模拟点击下一页,那么执行完毕后,是否还要有加载下一页面的动作?也就是说还要执行诸如 driver.get(下一页网址) 的语句?并且下一页面的网址要如何获取,有什么函数可以直接返回这个网址么? 
    恳请指点,感谢! 
    
    
    8 条回复    2017-09-29 08:53:40 +08:00
    cdwyd
        1
    cdwyd  
       2017-09-22 21:09:41 +08:00 via Android
    手动点一下看看真正的请求是什么去抓就行
    brightguo
        2
    brightguo  
       2017-09-22 21:12:45 +08:00
    0.应该是的
    1.不需要再 get
    2.如果能 get 何必要虚拟点击,囧~
    saximi
        3
    saximi  
    OP
       2017-09-22 21:26:51 +08:00
    @brightguo 不知为何,我的部分代码没有正确显示出来,我重新贴一下我的完整问题吧。

    在爬取某网站时,要根据页面上的选择页控件接着爬取下一个页面,但是控件中下一页的网址并没有直接给出来,而是形如这样的源码:<a onclick="queryListByPage('3')">3</a>
    其中的 queryListByPage 应该是点击“ 3 ”这个页码的方框时会触发的函数。我想用 selenium.webdriver 和 PhantomJS 来模拟点击页码并进入下一页面的动作,我写了如下的语句:
    nextpageButton = driver.find_element_by_name(response.xpath('a/@onclick').extract())
    nextpageButton.click()

    我面临的问题如下:
    1、上面的语句是否可以实现模拟点击下一页页码按钮的效果
    2、如果上面语句可以模拟点击下一页,那么执行完毕后,是否还要有加载下一页面的动作?也就是说还要执行诸如 driver.get(下一页网址) 的语句?并且下一页面的网址要如何获取,有什么函数可以直接返回这个网址么?
    saximi
        4
    saximi  
    OP
       2017-09-22 21:28:51 +08:00
    @brightguo 假如 nextpageButton.click() 这个语句就等同于 driver.get(下一页网址) 这个语句的效果,那么请问,包含下一个页面内容的对象是什么? 应该不是 response 了吧?
    brightguo
        5
    brightguo  
       2017-09-24 11:02:31 +08:00
    1.那部分内容可能是 js 渲染的,你得等待一会----可以用个循环( time.sleep(1)一直检测那个元素出来没,出来了再做后面解析
    2.nextpageButton 我没那么写过,我最多直接用 driver.find_element_by_xpath,你那么套我不清楚找的对不对
    3.及时模拟点击了,后面有些内容可能也要睡一会才出现的(重新获取 driver.page_source )
    4.极力请使用 ChromeDriver,可以直接看到界面----每句语句的效果。phantomjs 已经没人维护了~
    saximi
        6
    saximi  
    OP
       2017-09-24 18:51:43 +08:00
    @brightguo 用 phantomJS 是为了起到无界面浏览器的效果,不知 ChromeDriver 可以起到同样效果么?
    dsg001
        7
    dsg001  
       2017-09-24 19:00:15 +08:00
    nextpageButton = driver.find_element_by_xpath('a/@onclick')
    nextpageButton.click()
    如果是 ajax 加载,则 time.sleep(10)

    phantomJS 已经被放弃了,chrome 60 以上的版本支持 headless 模式,可以在调试时使用界面,生产时使用 headless
    Marsss
        8
    Marsss  
       2017-09-29 08:53:40 +08:00
    import pdb
    pdb.set_trace()
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2557 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 15:40 · PVG 23:40 · LAX 07:40 · JFK 10:40
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.