水瓶座 发表于 2018-11-6 22:42:15

python爬取磁力猫--详细讲解

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



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

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

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")

with open("test.txt","w") as f:
    f.write(res.text)

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

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")

with open("test.txt","w",encoding="utf-8") as f:
    f.write(res.text)


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

确定目标后,就是开干了,回到网页,按f12或哦不,最好直接在资源文字上右键审查元素,
然后可以看到我们要的都在这个<div class="Search__result___2S94i" data-reactid="137">标签里,
接下来,不用说先定义一下函数,一个是取网页,一个是分析网页,直接贴代码顺便讲解
import requests as req
import bs4
import pyperclip as pyp
import re

def get_html(url):
    try:
      res = req.get(url)
      return res
   
    except:
      print("资源获取失败,正在重试,若重试几次都不行,可能是程序失效了!")
      res = get_html(url)
      return res


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

然后习惯

if __name__ == "__main__":
    while 1 == 1:
      main()
      print("Ctrl + C退出!")

作用:可以多次搜索

再定义main函数

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


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

    else:
      res = get_html("https://www.cilimao.me" + urls)
      get_mag(res)
      print("复制完成,请自行去浏览器测试!")

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

def get_mag(res):
    soup = bs4.BeautifulSoup(res.text,"html.parser")
    mag = soup.find("div",class_="Information__content_information___1e4H7")
    pyp.copy(mag.a["href"])
具体我就不讲了,经过上面的讲解,我相信小白也能看懂这个



结果

利用pyinstaller打包成exe可执行文件,脱离python{:10_256:}

完整代码和打包后的程序:
import requests as req
import bs4
import pyperclip as pyp
import re



def get_html(url):
    try:
      res = req.get(url)
      return res
   
    except:
      print("资源获取失败,正在重试,若重试几次都不行,可能是程序失效了!")
      res = get_html(url)
      return res


def data(res):
    urls = []
    soup = bs4.BeautifulSoup(res.text,"html.parser")
    information = soup.find_all("div",class_="Search__result___2S94i")
    i = 0
    for each in information:
       print(str(i) + "." + each.a.text + "\n"+ each.div.text+ "\n")
       urls.append(each.a["href"])
       i = i + 1

    return urls

def get_mag(res):
    soup = bs4.BeautifulSoup(res.text,"html.parser")
    mag = soup.find("div",class_="Information__content_information___1e4H7")
    pyp.copy(mag.a["href"])


def main():
    seach = input("请输入你要搜索的内容:")
    res = get_html("https://www.cilimao.me/search?word=" + seach + "&page=1")
    urls = data(res)
    num = int(input("请输入你想要的资源的序号:"))
   
    if re.search("baidu",urls) != None:
      pyp.copy(urls)
      print("复制完成,请自行去浏览器测试!")

    else:
      res = get_html("https://www.cilimao.me" + urls)
      get_mag(res)
      print("复制完成,请自行去浏览器测试!")


if __name__ == "__main__":
    while 1 == 1:
      main()
      print("Ctrl + C退出!")
链接: https://pan.baidu.com/s/1ocWoA1P973CsvnR2lhknLA 密码: 6666


dpj1119@163.com 发表于 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时,循环没停止呢

水瓶座 发表于 2018-11-6 23:19:04

dpj1119@163.com 发表于 2018-11-6 22:55
a=0
i=0
while True:


a+=i 是a = a + i的意思
也就是说,你的的全局变量i从始至终都没变过,所以这是无限循环,停不了,只能ctrl+c{:10_256:}

坏小子 发表于 2018-11-6 23:25:55

来看看完整代码

hwhrr 发表于 2018-11-6 23:39:36

hanshilong666 发表于 2018-11-7 08:29:22

谢谢分享

想抓兔子的云 发表于 2018-11-7 09:13:50

感谢分享

考拉熊 发表于 2018-11-7 09:15:03

过来顶一下

水瓶座 发表于 2018-11-7 13:00:49

考拉熊 发表于 2018-11-7 09:15
过来顶一下

好!{:10_298:}

轮回丶 发表于 2018-11-7 16:20:13

看下

追凡少年 发表于 2018-11-8 01:14:46

考拉熊 发表于 2018-11-8 09:20:04

过来顶一下

孙砼 发表于 2018-11-10 08:32:58

十脸懵逼

junpengAI 发表于 2018-11-10 23:13:15

{:5_109:}小白来学习了。

考拉熊 发表于 2018-11-11 09:14:22

过来顶一下

还差几 发表于 2018-11-11 10:35:11

{:5_102:}

kedobi 发表于 2018-11-11 14:59:37

谢谢楼主分享

小怪怪 发表于 2018-11-12 11:46:48

当for i in range(1,102): 这段代码在else 下执行到i=51的时候,不会跳到if 下去判断,而是继续往下执行,当执行到 i=101时候,跳出else,从头再次判断 i ,这个时候 i 大于50,跳出while 整个循环。      

——————————(来自3个月的小白)

ZDAWNKE 发表于 2018-11-12 15:32:24

谢谢大佬

Dorota 发表于 2018-11-12 15:51:23

{:9_228:}
页: [1] 2
查看完整版本: python爬取磁力猫--详细讲解