|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
首先我自己就是一个新人,来这里只是想分享一些个人心得。
近来论坛里的PY区比较火,特别是入门版块,可能跟PY广泛应用于各领域以及人工智能的大泡沫有关,也可能是各大学要考PY。但真心想入门的同学来看小甲鱼的视频是很好的,有幽默风趣的讲解还有BILIBILI里弹幕提神醒脑,这对于那些希望涉猎一下这门胶水语言的同学是很不错的。但是如果想学爬虫,想更快更深入地了解学习这门语言的同学,我建议先一定不要去看视频,因为视频有分P之嫌和聊天扯淡较多,一开始一定要自己去找书来看,对于很多同学来说书上的知识在经过精心编译后还是通俗易懂的,在此推荐一下《21天学通Python》这本书。书里面有详细的从安装到深入的知识,这比自己从百度搜XX如何安装XX如何配置环境变量XX报错是啥意思高效地多,当然看书往往是很枯燥的,也不易懂,这时就可以练习书上的代码。如有不懂就可以去找对应章节的小甲鱼视频来看,甚至把他的作业也做了来加深印象。
如果目的是学习爬虫,可以了解了大概的语法后直接上手去爬自己想要的东西,当然我们还是不会爬,于是就可以找到相应的鱼塘里的源代码来练习,注意一定要多练几遍,这样就有了印象也提升了手速。这是就会思考这些这些代码是表示什么意思,这时就可以直接找到小甲鱼论坛里入门PY板块的扩展阅读了,里面都有分类好了的通俗易懂的解释。如若再不懂就可以发帖求助,注意发帖前先了解规则和提问的正确方式。在爬各类小黄图的路上,各位肯定不会枯燥啦,而兴趣又是最好的老师,它会强行快速磨练你,提升你,这时你回头看看好多同学还挣扎徘徊在小甲鱼视频里的前三集里(活不过前三集哈哈哈哈手动滑稽),这时你可以看着电脑上的弹幕,点一杯卡布奇诺,默默打开某OOXX文件夹没有说话地“学习”起来了。
然后随着入越深你会发现好多基础没搞明白,但,这没关系。在多行代码多日奋战中相信很多基础的东西都能搞明白,这时不要停下来——直接去学习别的语言如C如JAVA(选择一门就好了),然后还是同样的方法学习。因为各语言之间有它们的共性,先学了胶水语言就能很好地将各类语言粘在一起,而随着对编程的广泛了解我们会不知觉地把基础更加扎实。
最后分享一段代码:import urllib.request as u
import urllib.parse as p
import chardet
import re
import os
import easygui as e
import socket
def open_url(url):
req = u.Request(url)
response = u.urlopen(req)
html = response.read()
return html
def find_thum_detail(url):
html = open_url(url).decode('gbk')
r_thum = re.compile(r'A class=neihan-list-pic (.+?)/SPAN',re.S)
thum_list = r_thum.findall(html)
return thum_list
def get_thum_list(url):
list_detail = []
thum_list = find_thum_detail(url)
r_next_page = re.compile(r'href="(.+?)" target=_blank')
r_title = re.compile(r'alt="(.+?)"></A')
r_thum_url = re.compile(r'src="(.+?\.png)|src="(.+?\.jpg)')
for i in thum_list:
thum_url = r_thum_url.findall(i)[0][0]
if not thum_url:
thum_url = r_thum_url.findall(i)[0][1]
list_tmp = [r_next_page.findall(i)[0],r_title.findall(i)[0],thum_url]
list_detail.append(list_tmp)
return list_detail
def save_thum(url,p_path):
print(url)
index = 0
try:
with open(p_path+os.sep+'xuchuan.txt') as f_xuchuan:
length = len(f_xuchuan.readlines())
print(length)
except:
pass
if os.path.isfile(p_path+os.sep+'xuchuan.txt'):
print('发现上次未下载完成内容,继续上次下载~!')
with open(p_path+os.sep+'xuchuan.txt') as f_xuchuan:
list_xuchuan = f_xuchuan.readlines()
url = re.findall(r'.+',list_xuchuan[0])[0]
print(url)
if length > 1:
if list_xuchuan[-1] == '\n':
try :
detail_img_url = re.findall(r'.+',list_xuchuan[-2])[0]
except:
pass
else:
detail_img_url = re.findall(r'.+',list_xuchuan[-1])[0]
try:
detail_img_url_short = re.findall(r'.+/(.+\.html)',detail_img_url)[0]
list_thum = get_thum_list(url)
for i in list_thum:
if detail_img_url_short == re.findall(r'.+/(.+\.html)+',i[0])[0]:
index = list_thum.index(i)
except:
pass
with open(p_path+os.sep+'xuchuan.txt','w') as f_xuchuan:
f_xuchuan.write(url+'\n')
thum_list = get_thum_list(url)[index:]
re_ext = re.compile(r'.+(\..+)')
p_path = p_path + os.sep
for i in thum_list:
ext = re_ext.findall(i[2])
path_tmp = p_path+i[1]+os.sep
if not os.path.isdir(path_tmp):
os.mkdir(path_tmp)
with open(path_tmp+'缩略图'+ext[0],'wb') as f:
img = open_url(i[2])
f.write(img)
save_detail(url,path_tmp,i,p_path)
os.remove(p_path+'xuchuan.txt')
return url
def save_detail(url,path_tmp,i,p_path):
re_detail = re.compile(r'div class="wz-picrrc".+src="(.+?\.jpg)')
re_next_page = re.compile(r'''<div class="wz-page">.+href='(.+)'>下一页''',re.S)
re_page_short = re.compile(r'.+/(.+?\.html)')
count = 0
n =1
url_main_short = re.findall(r'.+/(.+\.html)',url)[0]
url_short = re.findall(r'.+/(.+\.html)',i[0])[0]
url = re.sub(url_main_short,url_short,url)
with open(p_path+'xuchuan.txt','a') as f_xuchuan:
f_xuchuan.write(url+'\n')
print('开始下载【%s】图集' %i[1])
while True:
print('正在处理%s.....' %url)
try:
html = open_url(url).decode('gbk')
except:
print('打开%s地址出错,继续下载下一个妹妹~' %url)
break
try:
img_detail_url =re_detail.findall(html)[0]
with open(path_tmp+str(count)+'.jpg','wb') as f:
try:
img_detail = open_url(img_detail_url)
except:
print('【%s】图片打开错误,重试第%d次' %(img_detail_url,n))
n += 1
if n<= 3:
continue
else:
print('【%s】图片下载失败~!-_-'%img_detail_url)
pass
n = 1
try:
f.write(img_detail)
except:
pass
except IndexError:
print('本妹子下载完成~!')
break
page_short = re_page_short.findall(url)[0]
try:
next_page_short = re_next_page.findall(html)[0]
except:
print('靠,这个几把网站,有的有下一页按钮,有的没有,这个是没有下一页的页面,已经全部下载完成了~!!!!')
break
url = re.sub(page_short,next_page_short,url)
count += 1
def next_url(url):
html = open_url(url).decode('gbk')
r_page_short = re.compile(r'.+/(.+?\.html)')
r_next_page_short = re.compile(r'''<ul class="pagelist">.+<li><a href='(.+)'>下一''',re.S)
try:
next_page_short = r_next_page_short.findall(html)[0]
except:
print('没有下一页了')
return None
page_short = r_page_short.findall(url)[0]
next_page = re.sub(page_short,next_page_short,url)
print('开始下载下一页~!')
print('======================================================')
return next_page
if __name__ == '__main__':
socket.setdefaulttimeout(10)
url = 'http://www.qqcyl.net/mntp/wlmn/list_6051_1.html'
p_path = input('请输入想要保存的文件夹:【例C://meinv】')
while True:
a = save_thum(url,p_path)
url = next_url(a)
if not url:
break
|
|