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

2020-04-12 00:10:44 +08:00
 jeblur

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

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 提取到图片吗?

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

2398 次点击
所在节点    Python
9 条回复
crella
2020-04-12 00:16:53 +08:00
你只是从网页里获取到图片的地址,并没有添加“把图片下载下来”的过程啊
jeblur
2020-04-12 00:20:08 +08:00
@crella 我这个 save2pic 函数不能保存到文件吗。。
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
2020-04-12 00:31:08 +08:00
__name__不加引号……
gwy15
2020-04-12 00:37:50 +08:00
1.上面说的问题,你根本就没进到主函数里面。
2.写注释是好习惯,但是 py 的 docstring 是写在 def 下面第一行。
3.parse 返回的是 findall 结果(一个 list of str ),你处理的过程是直接把 str.content 写进去了。这里也得用 requests 先 get 。
jeblur
2020-04-12 00:39:45 +08:00
@crella 我的理解是这个 url 是由 parse 函数分离并送过来图片真实 url,所以原因是因为无法从 url 直接到文件?还需要中间再转一层?
jeblur
2020-04-12 00:42:34 +08:00
@gwy15
@crella
感谢回复,今天实在夯不动了,明天按照你们给的建议再捣腾下!
cdlnls
2020-04-12 01:31:09 +08:00
gey15 说的没错 ,if "__name__" == "__main__",这里__name__不加引号。这里错了,后面的 run()也不会运行,自然也没有后面的 print(url)。
jeblur
2020-04-12 08:46:58 +08:00
@gwy15
@cdlnls
@crella
感谢各位,代码跑通了

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

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

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

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

© 2021 V2EX