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

Python 爬虫小白尝试简单爬虫小疑惑

  •  
  •   ennisk · 2018-03-20 00:04:17 +08:00 · 2795 次点击
    这是一个创建于 2471 天前的主题,其中的信息可能已经有所发展或是发生改变。
    第一次玩 python, 也是第一次玩爬虫

    import requests
    from lxml import etree

    url = 'http://s.weibo.com/top/summary'
    data = requests.get(url).text
    s=etree.HTML(data)

    result1 = s.xpath('//*[@id="pl_common_searchTop"]')
    result2 = s.xpath('//*[@id="realtimehot"]')

    print(result1)
    print(result2)

    输出:

    [<Element div at 0x10874a888>]
    []

    为何 result2 为空?而 result1 能获取到,而且 xpath 一级一级往下获取有时候直接就获取不到对象了,发现在获取不到的前面会有
    <!-- xxx -->
    这样的注释,是因为这个才获取不到吗?大神求指点,翻来翻去没翻到有这种情况,可能是属于 hello world 级别问题了...
    9 条回复    2018-03-22 00:42:17 +08:00
    okface
        1
    okface  
       2018-03-20 00:10:19 +08:00 via Android
    第二个 xpath 的是异步加载的吧,你可以看下爬下来的 html 和网页源代码是否相同
    Leigg
        2
    Leigg  
       2018-03-20 00:21:47 +08:00 via iPhone
    在原网页中右键查看源码,然后搜索你要查找元素的标签名或者字符串,仔细对比有没有,如果没有就表示是异步加载,也就是常说的 ajax 技术,需要用浏览器 f12 调试找出对应的 js 请求链接,再去请求该链接,就能拿到数据,,我也是刚忙完
    ennisk
        3
    ennisk  
    OP
       2018-03-20 09:36:46 +08:00
    @okface
    @Leigg

    爬下来的的 html 跟网页源代码是一样的
    vincenth520
        4
    vincenth520  
       2018-03-20 09:37:01 +08:00
    因为是用 js 生成的元素
    xpresslink
        5
    xpresslink  
       2018-03-20 10:13:18 +08:00
    data = requests.get(url).text
    加个参数
    data = requests.get(url, stream=True).text
    Hopetree
        6
    Hopetree  
       2018-03-20 11:03:37 +08:00
    你自己去看源代码,然后分别搜索你的这两个 ID,第一个是能搜索到的,第二个搜不到,说明源代码中根本没有这个 ID
    ennisk
        7
    ennisk  
    OP
       2018-03-20 23:48:54 +08:00
    @xpresslink 加参数结果一样

    找到 ajax 的请求链接拿到的数据

    try{window.&( 热搜数据的 json );}catch(e){}

    是这样的格式,用 python 自带的 json 解析不了
    xpresslink
        8
    xpresslink  
       2018-03-21 11:12:24 +08:00
    实际上数据请求时已经一次性取回来了,只不过是封装成 json 被传到 js 脚本里,然后再渲染的。

    mport requests
    import re

    url = 'http://s.weibo.com/top/summary'
    data = requests.get(url).text
    result = re.findall(r'realtimehot\\">(.*?)(?=<\\/a>)', data)

    for item in result:
    print(item.encode('ascii').decode('unicode-escape'))

    偶遇李沁

    1 秒睡着睡眠质量差


    男方家里买来这样的家具

    化妆品重金属锑超标

    金毛患哮喘主人陪散步

    发错信息还被回复

    合肥奶奶台湾爷爷

    朱亚文承认二胎

    窃贼与失主同名同姓住同村

    蛟龙突击队押解海盗

    机智撩妹救下轻生女孩

    全班只有一个男生

    网约车打到兰博基尼

    韩东君王文也否认恋情

    卫生纸变占座神器

    厦门这家餐厅只卖煮泡面

    胸罩内藏十公斤黄金

    泰剧天生一对

    陌上花开燕子归

    兰博新皮肤

    你的睡眠合格吗

    惠若琪公布恋情

    3unshine 新剧停拍

    歌手 声明

    五大最壮观的自然景象

    脸皮厚的人更长寿

    朱正廷公司声明

    荔枝味的吻

    理想中的婚后生活

    将卧室改成温馨病房

    彭于晏

    蔡徐坤 repo

    寄 iPhone 签收 5 坨铁

    春分

    张一山 王俊凯

    猫住二楼 狗住一楼

    #异地恋甜蜜的细节#

    男生想象的女孩子生活

    热门面部修容

    妊娠纹

    惠若琪身高

    胡杏儿叶璇

    卖房照顾痴呆母亲 20 年

    因哭泣被赶下飞机

    熊猫养成必经之路

    春分竖蛋

    小哥雨夜背老人上摆渡车

    李泽钜 戴其冠承其重

    踏青赏花
    ennisk
        9
    ennisk  
    OP
       2018-03-22 00:42:17 +08:00 via iPhone
    @xpresslink 感谢 这种情况就无法用 xpath 解析得用正则是吗?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1073 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 22:57 · PVG 06:57 · LAX 14:57 · JFK 17:57
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.