精
python爬取磁力猫--详细讲解 |
|
聆听彼岸
L2
• 2018-11-06 • 回复 19 • 最后编辑于2018-11-06 23:29 • 只看楼主
• 举报
|
前言:
看到这个编程板块发的全是资源分享,先吐槽一下,我感觉代码美化功能都成摆设了,其实我觉得那些教程什么的应该放到学习那个板块。然后,这应该是这个板块第一篇讲思路的帖子,之后再说说我写这个程序的原因,其实磁力猫不用爬就很好用了,但是这里讲的是技术,我只是分享经验,如果你想吐槽或者喷我之类的,手机客户端请单击左上角的箭头,Windows请按住右键往下再往右画个近似直角(这个我经常用)好了,废话不多说。
开始
首先,准备工具:
1.电脑
2.python(废话)
3.小白鼠https://www.cilimao.me/(百度也有)
4.requests,bs4,re,pyperclip(这四个是什么就不解释了,最后一个非必须,度娘搜来的,用来复制粘贴)
开始
打开网页,随便搜一个,从地址栏可以发现,一个搜索用的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退出!")
这里的while的作用:可以多次搜索
再定义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[num]) != None:
pyp.copy(urls[num])
print("复制完成,请自行去浏览器测试!")
else:
res = get_html("https://www.cilimao.me" + urls[num])
get_mag(res)
print("复制完成,请自行去浏览器测试!")
if记得要缩进,然后继续,如果是百度网盘就往下执行,如果不是也就是磁力链,往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"])
具体我就不讲了,经过上面的讲解,我相信小白也能看懂这个
结果
完整代码和打包后的程序: