wanwfy 发表于 2019-7-31 09:52

某图片网爬虫

感觉逻辑还是有点乱,希望有大神们多指点,该网站没有什么反爬措施,因此没有加headers,因为主要是练手用,我特意把爬取的页数改小了,感觉做人还是要厚道一些。

爬取过程中有一个提示,大概就是这个if else需要改成别的(这种if else 写法是我前几天刚刚学到的,感觉很实用:lol),但是我不知道怎么改,期待大神指教。
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
全部代码如下:
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}" 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()

wanwfy 发表于 2019-7-31 15:18

重新优化了一下代码,加了延时和异常处理,图片名以文字保存,如果不需要按每页保存可以把创建目录和保存路径里面的代码删掉。

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
                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:

改一下,download函数试试,因为我测试中没有出现错误,因此就没有加try...except
   def download(self, url):
      try:
            r = requests.get(url)
            return r.content
      except Exception:
            print(f'爬取失败:{url}')

依旧沉沉 发表于 2019-7-31 10:11

怀疑你在开车,而且还证据确凿,看在你以技术的角度出发,就不举报了:$qqq

宿醉只为伊人 发表于 2019-7-31 10:31

虽然不太懂,但是很厉害的样子

zyhxhw 发表于 2019-7-31 10:37

非常感谢,正在学习。不过,还真的看不懂。运行的时候出现这个东西,是不是正常啊
TimeoutError: 由于连接方在一段时间后没有正确答复或连接的主机没有反应,连接尝试失败。

aut160819 发表于 2019-7-31 10:38

我就单字 一个 6 666

bluerabbit 发表于 2019-7-31 10:39

那个警示的意思是建议改成标准的if...else...吗?

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...吗?

if tr:


不知道呢,因为我感觉一句更简洁:lol

anadask 发表于 2019-7-31 11:47

正好学习来看看

godfather1103 发表于 2019-7-31 12:38

网址收藏了{:1_918:}
页: [1] 2
查看完整版本: 某图片网爬虫