某图片网爬虫
感觉逻辑还是有点乱,希望有大神们多指点,该网站没有什么反爬措施,因此没有加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()
重新优化了一下代码,加了延时和异常处理,图片名以文字保存,如果不需要按每页保存可以把创建目录和保存路径里面的代码删掉。
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()
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}')
怀疑你在开车,而且还证据确凿,看在你以技术的角度出发,就不举报了:$qqq 虽然不太懂,但是很厉害的样子 非常感谢,正在学习。不过,还真的看不懂。运行的时候出现这个东西,是不是正常啊
TimeoutError: 由于连接方在一段时间后没有正确答复或连接的主机没有反应,连接尝试失败。 我就单字 一个 6 666 那个警示的意思是建议改成标准的if...else...吗?
if tr:
img_url_ = tr.xpath('//li/*[@target="_blank"]/@href')
else:
img_url_ = None bluerabbit 发表于 2019-7-31 10:39
那个警示的意思是建议改成标准的if...else...吗?
if tr:
不知道呢,因为我感觉一句更简洁:lol 正好学习来看看 网址收藏了{:1_918:}
页:
[1]
2