鱼C论坛

 找回密码
 立即注册
查看: 319|回复: 21

[作品展示] python爬取磁力猫--详细讲解

[复制链接]
最佳答案
3 
发表于 2018-11-6 22:42:15 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
闲聊
首先说一下,本人中学生屌丝一枚
超久前看了小甲鱼老师的零基础python教程,当然,没坚持下去,连一半都没看到就放弃了。应该是因为没什么有趣的东西玩玩,所以三天打鱼,两天晒网。之后看到有关python的大部分都是爬虫,于是对爬虫产生了兴趣,之后看到了《极客python之效率革命》,看到只有几课,而对于我这种以七科学习为中心,闲暇时间学别的有志青年,准备发展成为有为青年的青年当然是不二之选。于是乎,带着一丢丢少得可怜的python基础跟着小甲鱼老师去实践 终于,功夫不负有心人,在美丽大方举止端庄的度娘的陪伴下 我坚持了下来(我靠,我自己都想吐槽了,就特么几课而已,还谈到了坚持...),然后最近在和同学吹水的过程中谈到了爬虫,他一脸懵逼的看着我然后说听不懂我说啥,不想学因为没兴趣,也不知道有啥用,我就问了他常去的网站是什么,他说没有 要说真有那就是去搜电影然后迅雷下载,我一下那不就是磁力链么,于是便想弄一个找磁力链的程序给他用用,给他点兴趣 毕竟人类是群居动物,独乐乐不如众乐乐。于是有了下文,算了算了,不瞎BB了,直接开始记录:



开始
首先,准备工具:
1.电脑
2.python(废话)
3.小白鼠https://www.cilimao.me/(百度也有)
4.requests,bs4,re,pyperclip(这四个是什么就不解释了,最后一个非必须,度娘搜来的,用来复制粘贴)
5.一双打代码的手
6.好像没了,自己脑补,哈哈!

过程
打开网页,随便搜一个,从地址栏可以发现,一个搜索用的URL,以及一些参数word=搜索内容,page=页数
所以,首先导入requests然后下载这个网页存到test.txt里,看这个网页有没有我们想要的资源
代码:
  1. import requests as req

  2. res = req.get("https://www.cilimao.me/search?word=%E5%A4%8D%E4%BB%87%E8%80%85%E8%81%94%E7%9B%9F&page=1")

  3. with open("test.txt","w") as f:
  4.     f.write(res.text)
复制代码

然后,报错了,这里不得不注意一下,对于小白来说,肯定是上论坛问大神,而对于看过效率革命的我嘛,当然不是问题,编码问题,因为网页是utf-8的编码,所以更正后代码如下
  1. import requests as req

  2. res = req.get("https://www.cilimao.me/search?word=%E5%A4%8D%E4%BB%87%E8%80%85%E8%81%94%E7%9B%9F&page=1")

  3. with open("test.txt","w",encoding="utf-8") as f:
  4.     f.write(res.text)
复制代码


之后用notepad++打开可以看到,我们需要的都在,如下图,好像还有链接我没圈,不过没关系,知道就行

确定目标后,就是开干了,回到网页,按f12或哦不,最好直接在资源文字上右键审查元素,
然后可以看到我们要的都在这个<div class="Search__result___2S94i" data-reactid="137">标签里,
接下来,不用说先定义一下函数,一个是取网页,一个是分析网页,直接贴代码顺便讲解
  1. import requests as req
  2. import bs4
  3. import pyperclip as pyp
  4. import re
复制代码
  1. def get_html(url):
  2.     try:
  3.         res = req.get(url)
  4.         return res
  5.    
  6.     except:
  7.         print("资源获取失败,正在重试,若重试几次都不行,可能是程序失效了!")
  8.         res = get_html(url)
  9.         return res


  10. def data(res):
  11.     urls = []
  12.     soup = bs4.BeautifulSoup(res.text,"html.parser")
  13.     information = soup.find_all("div",class_="Search__result___2S94i")
  14.     i = 0
  15.     for each in information:
  16.        print(str(i) + "." + each.a.text + "\n"+ each.div.text+ "\n")
  17.        urls.append(each.a["href"])
  18.        i = i + 1
复制代码

第一个取网页,取网页函数get_html(中文数字表示行数)
一,有时候有些网页会有主机不回应的情况,所以用try监视这段代码,看有没有出错(主机不回应),若出错直接跳转去执行except后面的代码
二,下载(取)地址为参数一url的网页
三,返回取到的网页
四,标记出错后执行的代码
五,告诉用户出错了
六,调用自身重新下载网页,也就是说,如果它一直出错那么就会一直重新下载,而当它下载成功时就会相当于回到第二行,然后往下返回下载到的网页,一直返回到调用这个get_html函数的地方
七,这个不解释,其实上一句已经连同这句也解释了,作用也同  三
第二个分析数据
一,定义一个空列表,如果不定义的话,下面加东西的时候会报错,因为这个列表不存在
二,煲汤 没错,把网页丢到汤里,解析它
三,在汤里找全部的肉 (找储存着我们要的东西的标签)
四,定义一个整形变量,变量值为0,因为列表的索引从0开始,取链接用,告诉用户这是列表的第几个数据用(这个理解容易,解释貌似不太清楚)
五,使用for循环迭代什么的,我都说我基础差,哈哈,好像是迭代,总之把information就像是一些肉,肉切的时候没切断,现在切断,然后把切断的放到each里,有多少肉就循环多少次
六,打印一下资源信息
七,把each里我们要的链接放进列表
八,每次循环i就加1,i的作用看上面四

然后习惯

  1. if __name__ == "__main__":
  2.     while 1 == 1:
  3.         main()
  4.         print("Ctrl + C退出!")
复制代码

作用:可以多次搜索

再定义main函数

  1. def main():
  2.     seach = input("请输入你要搜索的内容:")
  3.     res = get_html("https://www.cilimao.me/search?word=" + seach + "&page=1")
  4.     urls = data(res)
  5.     num = int(input("请输入你想要的资源的序号:"))
复制代码


很容易理解,把你想搜的资源名称放到seach里,然后调用get_html函数,再把下载好的网页对象放进res里,然后放进data函数分析,再把分析完返回的链接列表放进urls,在data分析时会把那个i作为序号打印出来,然后你想要哪个就发哪个,然后main的下半部分
  1.    
  2.     if re.search("baidu",urls[num]) != None:
  3.         pyp.copy(urls[num])
  4.         print("复制完成,请自行去浏览器测试!")

  5.     else:
  6.         res = get_html("https://www.cilimao.me" + urls[num])
  7.         get_mag(res)
  8.         print("复制完成,请自行去浏览器测试!")
复制代码

如果是百度网盘就往下执行,如果不是也就是磁力链,往else执行,因为还要进另一个网页,所以如上,至于分析网页就只能交给另一个函数执行了,于是又定义一个函数,然后在里面直接把磁力链复制到剪贴板,另一个函数如下

  1. def get_mag(res):
  2.     soup = bs4.BeautifulSoup(res.text,"html.parser")
  3.     mag = soup.find("div",class_="Information__content_information___1e4H7")
  4.     pyp.copy(mag.a["href"])
复制代码

具体我就不讲了,经过上面的讲解,我相信小白也能看懂这个



结果

利用pyinstaller打包成exe可执行文件,脱离python

完整代码和打包后的程序:
游客,如果您要查看本帖隐藏内容请回复



搜索地址

搜索地址

检验资源存在

检验资源存在

评分

参与人数 1荣誉 +10 收起 理由
alltolove + 10 鱼C有你更精彩^_^

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
最佳答案
0 
发表于 2018-11-6 22:55:47 | 显示全部楼层
a=0
i=0
while True:
    if i>50:
        break
    else:
        for i in range(1,102):
            if i%3==0 or i%5==0:
                print(i)
                a+=i
                print(a)
为啥i=51时,循环没停止呢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
最佳答案
3 
 楼主| 发表于 2018-11-6 23:19:04 | 显示全部楼层

a+=i 是a = a + i的意思
也就是说,你的的全局变量i从始至终都没变过,所以这是无限循环,停不了,只能ctrl+c
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
最佳答案
3 
发表于 2018-11-6 23:25:55 | 显示全部楼层
来看看完整代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
最佳答案
0 
发表于 2018-11-6 23:39:36 | 显示全部楼层
xczvxzvcxzbcv
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
最佳答案
0 
发表于 2018-11-7 08:29:22 | 显示全部楼层
谢谢分享
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
最佳答案
0 
发表于 2018-11-7 09:13:50 | 显示全部楼层
感谢分享
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
最佳答案
0 
发表于 2018-11-7 09:15:03 | 显示全部楼层
过来顶一下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
最佳答案
3 
 楼主| 发表于 2018-11-7 13:00:49 | 显示全部楼层

好!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
最佳答案
0 
发表于 2018-11-7 16:20:13 | 显示全部楼层
看下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
最佳答案
0 
发表于 2018-11-8 01:14:46 | 显示全部楼层
36
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
最佳答案
0 
发表于 2018-11-8 09:20:04 | 显示全部楼层
过来顶一下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
最佳答案
0 
发表于 7 天前 | 显示全部楼层
十脸懵逼
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
最佳答案
0 
发表于 7 天前 | 显示全部楼层
小白来学习了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
最佳答案
0 
发表于 6 天前 | 显示全部楼层
过来顶一下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
最佳答案
1 
发表于 6 天前 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
最佳答案
0 
发表于 6 天前 | 显示全部楼层
谢谢楼主分享
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
最佳答案
0 
发表于 5 天前 | 显示全部楼层
当  for i in range(1,102): 这段代码在else 下执行到i=51的时候,不会跳到if 下去判断,而是继续往下执行,当执行到 i=101时候,跳出else,从头再次判断 i ,这个时候 i 大于50,跳出while 整个循环。      

——————————(来自3个月的小白)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
最佳答案
0 
发表于 5 天前 | 显示全部楼层
谢谢大佬
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
最佳答案
0 
发表于 5 天前 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

小甲鱼强烈推荐上一条 /1 下一条

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号

GMT+8, 2018-11-17 12:35

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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