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

[求助] 关于新手爬虫实例

  •  
  •   jeblur · 2020-04-12 00:10:44 +08:00 · 2399 次点击
    这是一个创建于 1690 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近看了些关于爬虫的视频,根据视频的代码来找其他的一些网站试试水,代码写好后运行发现没报错但是也没有抓到图片,代码如下:

    import requests
    import re
    import time
    import os
    
    
    """Web Requests"""
    def getOnePage(n):
        html = f'http://www.win4000.com/wallpaper_detail_167506_{n}.html'
        response = requests.get(html)
        return response.text
    
    """Content Traverse"""
    def parse(html):
        url = re.findall('<img class=".*?" src="(.*?)" alt=".*?" title=".*?"/>',html)
        print(url)
        return url
    
    """Save Pictures"""
    def save2pic(url):
        pic_name = url.split('/')[-1]
        with open(pic_name, 'wb') as f:
            f.write(url.content)
    
    def run():
        for n in range(1,10):
            html = getOnePage(n)
            items = parse(html)
            for item in items:
                save2pic(item)
    
    if "__name__" == "__main__":
        run()
    
    

    自我感觉问题是在保存数据目录这里,还有 parse 函数可能也有问题,因为没有显示 print 的数据。

    希望各位前辈指导下,感激不尽!

    还有一个小问题,是关于使用 xpath 抓取 url 如何写呢,视频中的写法是:

    html = etree.HTML(text)
    names = html.xpath('')
    

    其中的 HTML 是一个固定用法吗?这样做变成了一个列表,会影响后续 url 提取到图片吗?

    问题可能很小白,但是还是希望各位大大能给些意见,再次感谢!

    9 条回复    2020-04-12 08:46:58 +08:00
    crella
        1
    crella  
       2020-04-12 00:16:53 +08:00
    你只是从网页里获取到图片的地址,并没有添加“把图片下载下来”的过程啊
    jeblur
        2
    jeblur  
    OP
       2020-04-12 00:20:08 +08:00 via iPad
    @crella 我这个 save2pic 函数不能保存到文件吗。。
    crella
        3
    crella  
       2020-04-12 00:28:04 +08:00
    """Save Pictures"""
    def save2pic(url):
    (1 个 tab)pic_name = url.split('/')[-1] # 把 url 中图片的真实文件名 fn 提取出来
    (1 个 tab)with open(pic_name, 'wb') as f: # 在本地创建一个文件,文件名为 fn,按二进制模式覆盖写入,句柄为 f
    (2 个 tab)f.write(url.content) # f 句柄写入 url 的内容

    那么 url 到底是指"http://website.com/1.jpg"这个文本还是指 1.jpg 的内容呢? 你上一步是怎么处理的?

    我不懂编程的,仅供参考
    gwy15
        4
    gwy15  
       2020-04-12 00:31:08 +08:00 via Android
    __name__不加引号……
    gwy15
        5
    gwy15  
       2020-04-12 00:37:50 +08:00 via Android
    1.上面说的问题,你根本就没进到主函数里面。
    2.写注释是好习惯,但是 py 的 docstring 是写在 def 下面第一行。
    3.parse 返回的是 findall 结果(一个 list of str ),你处理的过程是直接把 str.content 写进去了。这里也得用 requests 先 get 。
    jeblur
        6
    jeblur  
    OP
       2020-04-12 00:39:45 +08:00 via iPad
    @crella 我的理解是这个 url 是由 parse 函数分离并送过来图片真实 url,所以原因是因为无法从 url 直接到文件?还需要中间再转一层?
    jeblur
        7
    jeblur  
    OP
       2020-04-12 00:42:34 +08:00 via iPad
    @gwy15
    @crella
    感谢回复,今天实在夯不动了,明天按照你们给的建议再捣腾下!
    cdlnls
        8
    cdlnls  
       2020-04-12 01:31:09 +08:00 via iPhone
    gey15 说的没错 ,if "__name__" == "__main__",这里__name__不加引号。这里错了,后面的 run()也不会运行,自然也没有后面的 print(url)。
    jeblur
        9
    jeblur  
    OP
       2020-04-12 08:46:58 +08:00
    @gwy15
    @cdlnls
    @crella
    感谢各位,代码跑通了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5833 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 32ms · UTC 01:44 · PVG 09:44 · LAX 17:44 · JFK 20:44
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.