吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 7625|回复: 12
收起左侧

[Python 转载] 某图片网爬虫

[复制链接]
wanwfy 发表于 2019-7-31 09:52
感觉逻辑还是有点乱,希望有大神们多指点,该网站没有什么反爬措施,因此没有加headers,因为主要是练手用,我特意把爬取的页数改小了,感觉做人还是要厚道一些。

爬取过程中有一个提示,大概就是这个if else需要改成别的(这种if else 写法是我前几天刚刚学到的,感觉很实用),但是我不知道怎么改,期待大神指教。
[Python] 纯文本查看 复制代码
 FutureWarning: The behavior of this method will change in future versions. Use specific 'len(elem)' or 'elem is not None' test instead.
  img_url_ = tr.xpath('//li/*[@target="_blank"]/@href') if tr else None

全部代码如下:
[Python] 纯文本查看 复制代码
import requests
from lxml import etree
import os


class MeiNV(object):
    def __init__(self):
        self.urls = []
        self.imgs = []

    def url_link(self):

        start_url = 'http://pic.netbian.com/4kmeinv/'
        for x in range(1, 5):

            if x != 1:

                self.urls.append(f"{start_url}index_{x}.html")
            else:
                self.urls.append('http://pic.netbian.com/4kmeinv/')

    def download(self, url):
        r = requests.get(url)
        return r.content

    def go(self):
        self.url_link()
        self.parse()
        self.get_img()

    def parse(self):
        for url in self.urls:
            html = self.download(url)
            tr = etree.HTML(html)
            img_url_ = tr.xpath('//li/*[@target="_blank"]/@href') if tr else None
            self.imgs.append(list(map(lambda x: f"http://pic.netbian.com{x}", img_url_)))

    def get_img(self):
        imgs = self.imgs
        print(len(imgs))
        cont = 1
        for links in imgs:
            for link in links:
                img_html = self.download(link)
                img_tr = etree.HTML(img_html)
                img_link1 = img_tr.xpath('//*[@id="img"]//@src')
                img_link = f"http://pic.netbian.com{img_link1[0]}" if img_link1 else None
                img = self.download(img_link)
                img_name = img_link.split('/')[-1]
                path = f'第{cont}页图片'
                if not os.path.exists(path):
                    os.makedirs(path)
                with open(f'第{cont}页图片/{img_name}', 'wb') as f:
                    f.write(img)
                print(f"正在下载第{cont}页图片", img_link)

            cont += 1


if __name__ == '__main__':
    meinv = MeiNV()
    meinv.go()

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
zyhxhw + 1 + 1 我很赞同!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| wanwfy 发表于 2019-7-31 15:18
重新优化了一下代码,加了延时和异常处理,图片名以文字保存,如果不需要按每页保存可以把创建目录和保存路径里面的代码删掉。

[Python] 纯文本查看 复制代码
import requests
from lxml import etree
import os


class MeiNv(object):
    def __init__(self):
        self.urls = []
        self.imgs = []

    def url_link(self):

        for x in range(1, 6):

            if x != 1:

                self.urls.append(f"{start_url}index_{x}.html")
            else:
                self.urls.append('http://pic.netbian.com/4kmeinv/')

    def download(self, url):
        try:
            r = requests.get(url, timeout=5)
            return r.content
        except Exception:
            print(f'爬取失败:{url}')

    def go(self):
        self.url_link()
        self.parse()
        self.get_img()

    def parse(self):
        for url in self.urls:
            html = self.download(url)
            tr = etree.HTML(html)
            img_url_ = tr.xpath('//li/*[@target="_blank"]/@href') if tr else None
            self.imgs.append(list(map(lambda x: f"http://pic.netbian.com{x}", img_url_)))

    def get_img(self):
        imgs = self.imgs
        print(len(imgs))
        cont = 1
        for links in imgs:
            for link in links:
                img_html = self.download(link)
                img_tr = etree.HTML(img_html)
                img_link1, img_name = img_tr.xpath('//*[@id="img"]//@src|//*[@id="img"]/img/@alt')
                img_link = f"http://pic.netbian.com{img_link1}"  # if img_link1 else None
                # img_name = img_data[1]
                img = self.download(img_link)
                path = f'第{cont}页图片'
                if not os.path.exists(path):
                    os.makedirs(path)
                with open(f'第{cont}页图片/{img_name}.jpg', 'wb') as f:
                    f.write(img)
                print(f"正在下载第{cont}页图片:", img_name)

            cont += 1


if __name__ == '__main__':
    start_url = 'http://pic.netbian.com/4kmeinv/'
    meinv = MeiNv()
    meinv.go()

 楼主| wanwfy 发表于 2019-7-31 11:12
zyhxhw 发表于 2019-7-31 10:37
非常感谢,正在学习。不过,还真的看不懂。运行的时候出现这个东西,是不是正常啊
TimeoutError: [WinErro ...

改一下,download函数试试,因为我测试中没有出现错误,因此就没有加try...except
[Python] 纯文本查看 复制代码
   def download(self, url):
        try:
            r = requests.get(url)
            return r.content
        except Exception:
            print(f'爬取失败:{url}')
依旧沉沉 发表于 2019-7-31 10:11
怀疑你在开车,而且还证据确凿,看在你以技术的角度出发,就不举报了
宿醉只为伊人 发表于 2019-7-31 10:31
虽然不太懂,但是很厉害的样子
zyhxhw 发表于 2019-7-31 10:37
非常感谢,正在学习。不过,还真的看不懂。运行的时候出现这个东西,是不是正常啊
TimeoutError: [WinError 10060] 由于连接方在一段时间后没有正确答复或连接的主机没有反应,连接尝试失败。
aut160819 发表于 2019-7-31 10:38
我就单字 一个 6 666
bluerabbit 发表于 2019-7-31 10:39
那个警示的意思是建议改成标准的if...else...吗?

[Python] 纯文本查看 复制代码
if tr:
    img_url_ = tr.xpath('//li/*[@target="_blank"]/@href')
else:
    img_url_ = None
 楼主| wanwfy 发表于 2019-7-31 11:07
bluerabbit 发表于 2019-7-31 10:39
那个警示的意思是建议改成标准的if...else...吗?

[mw_shl_code=python,true]if tr:

不知道呢,因为我感觉一句更简洁
anadask 发表于 2019-7-31 11:47
正好学习来看看
godfather1103 发表于 2019-7-31 12:38
网址收藏了
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止灌水或回复与主题无关内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-5-7 00:40

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表