前言

网上各种爬虫实战都有很多,比如爬取微博,贴吧消息,妹子图等等。但是爬bt的就很少了(似乎暴露了什么。。。),所以准备自己动手写一个爬bt的爬虫。

好的,话不多说进入正题,博主用的python3.6,ide用的sublim。

正文

首先就是寻找一个合适的bt搜索网站,记得以前有好多著名的bt站,比如种子列表,或者torrentkitty什么的,后来由于某些大家都知道的原因,这样的网站封禁了一大批。所以这次我选用的是一个名叫btbook的网站。emmm,虽然也有广告,但是算非常少的一个了,页面也比较干净。(大家不要好奇去点弹出的X榴社区的广告,那是假的!假的!)

用谷歌或者火狐自带的开发者工具。f12一下,可以看到网页源码,找到搜索框部分,如下

可以看到在一个id=“search-form”的表单里边有我们所需要的东西。我们还发现了更多的信息,比如通过这个表单向服务器传送数据的方法是get,文本框的name=‘q’等等。

接下来肯定是要导入各种爬虫所需要的库,urllib用于进行一系列对url的操作,BeautifulSoup用于解析html,使其变成字典或者数组,比起正则表达式来说方便了许多。

我们先编写代码尝试获取一下网站的html源码

[python] view plain copy
  1. from urllib.request import Request,urlopen
  2. from bs4 import BeautifulSoup
  3. url="http://www.btwhat.info/"
  4. html=urlopen(url)
  5. print(html.read())

运行一下发现HTTP ErroError 403

噫,这个网站还加了头部验证呀。既然要验证那我们就认为给他加上头部。在不知道要加哪些头部的时候,我们还是可以用chrom开发者工具f12来查看,点到network里边,看看都发送了哪些Request Hearders:

那么我们就手动给它加上headers,再尝试一遍。

from urllib.request import Request,urlopen
from bs4 import BeautifulSoupurl="http://www.btwhat.info/"
headers={'Accept': '*/*','Accept-Language':'zh-CN,zh;q=0.9','User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Safari/537.36','Connection': 'keep-alive','Referer':'http://www.btwhat.info/'}
req=Request(url,headers=headers)
html=urlopen(req)
print(html.read())

哇,成功的得到了html页面。

不过,这只是主页的html页面,和我们需要的还差的远呢。上边提到了使用get方法传送表单,那么我们肯定是要在网址里边加入我们要发送的data。

随便在输入框里边输入一个a试试

结果url出来了一串很复杂字符串,看起来跟a毫不相关。

我又试了试b

好像看出点眉目来了,a编码成了YQ和2个%3d,b是Yg和3个%3d,联想到%3d是url编码中=的编码。

所以实际上a编码成了YQ==,b编码成了Yg==。又联想到在结尾补上等号,这不是base64编码么~

于是立马验证了下搜索python3

(随便找了个在线编码/解码的网站)

哇,果然一样!只要再把等号换成%3d就行,这个简单,用replace()就能轻松做到。

于是通过导入base64模块编码关键字构建url,用get方法发送表单,代码如下:

from urllib.request import Request,urlopen
from bs4 import BeautifulSoup
import base64kw="python3"
kw_bs64=str(base64.b64encode(kw.encode("utf-8")),'utf-8')
keyword=kw_bs64.replace('=','%3d')
server='http://www.btwhat.info/search/b-'
url=server+keyword+'.html'headers={'Accept': '*/*','Accept-Language':'zh-CN,zh;q=0.9','User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Safari/537.36','Connection': 'keep-alive','Referer':'http://www.btwhat.info/'}
req=Request(url,headers=headers)
html=urlopen(req)
print(html.read())

运行结果如下,好不容易得出结果。结果一脸懵逼,我想要提取的标题呢?

再仔细一看,我去,原来藏在夹缝中,还又进行了一次编码,需要decodeURIComponent。

不过好在知道了我们所需要的内容都在<h3>标签里边,我们先用BeautifulSoup解析下,提取出<h3>中内容

bsObj=BeautifulSoup(html,'lxml')
resource_box=bsObj.findAll('h3')
print(resource_box)

嗯,这下就看起来舒服多了。接下来的任务就是提取出链接和种子标题了。

链接好说,提取a.attrs['href']就行,但是种子标题就麻烦了,不仅是分割的,还编码了,先将其拼接起来吧。

其实,博主最开始决定用正则表达式。业界有这么一句话:

“如果你有有个问题打算用正则表达式来解决,那么就是两个问题了”

这里边各种括号引号,着实让我头痛了一阵子(emm,也许是我水平太低了吧)

好在,这些表达式都比较有规律,多用几个replace函数也能提取出来

for each in resource_box :js_URIencode=each.find('a').textjs_URIencode=js_URIencode.replace('document.write(decodeURIComponent(','')js_URIencode=js_URIencode.replace('"+"','')js_URIencode=js_URIencode.replace('));','')print(js_URIencode)

成功将其拼接了!

接下来导入urllib 的parse.unquote方法进行解码,删去莫名其妙出现的<b>,(我也不造这个<b>哪来的。。。)在得到的链接前加上http://www.btwhat.info/,就能得到每个资源的网址,这里打印网址出来方便博文阅读。

for each in resource_box :js_URIencode=each.find('a').textjs_URIencode=js_URIencode.replace('document.write(decodeURIComponent(','')js_URIencode=js_URIencode.replace('"+"','')js_URIencode=js_URIencode.replace('));','')resource_name=parse.unquote(js_URIencode)resource_name=resource_name.replace('<b>','').replace('</b>','')print(resource_name)resource_url='http://www.btwhat.info'+each.find('a').attrs['href']print(resource_url)

终于得到我们想要的种子标题和对应的网址啦~

进入具体的页面,f12,磁力链接在'class'为'penel-body'的'div'里边

而文件类型,大小等信息在<td>标签里边

提取他们,修改一下格式和排版:

resource_req=Request(resource_url,headers=headers)
resource_html=urlopen(resource_req)
resource_bsObj=BeautifulSoup(resource_html,'lxml')
resource_hash=resource_bsObj.find('div',{'class':'panel-body'}).text
print(resource_hash.replace('\n',''))
resource_info=resource_bsObj.findAll('td')
print ("File Type: "+resource_info[0].text.replace('\n',''),end=" ")
print ("||Create Time: "+resource_info[1].text.replace('\n',''),end=" ")
print ("||Hot: "+resource_info[2].text.replace('\n',''),end=" ")
print ("||File Size: "+resource_info[3].text.replace('\n',''),end=" ")
print ("||File Count: "+resource_info[4].text.replace('\n','')+'\n')

这样就最终得到了我们想要的结果啦(才发现网址里边就包含了哈希值)~

不过,整体来看代码还有一些问题,功能没有整合。

我们将代码结构调整下,写成函数的形式,再加一些简单的异常处理。

整合如下:

# -*- coding: utf-8 -*-
# @Author: Nessaj
# @Date:   2018-03-06 20:57:46
# @Last Modified by:   Nessaj
# @Last Modified time: 2018-03-08 18:13:48from urllib.request import Request,urlopen
from urllib import parse
from bs4 import BeautifulSoup
import requests
import re
import base64"正确的传入参数需要对kw进行base64编码后再进行url编码(其实只要base64结尾的=换成%3d就行)"def get_search_url(kw,page=1,rule=1):"kw是搜索关键字,page是搜索结果的页数""rule是搜过结果的排序方式: 1.按create time排序  2.按File Size排序  3.按Hot排序 4.按Relevance排序""默认搜索第一页,且按照create time排序"server="http://www.btwhat.info/search/b-"kw_bs64=str(base64.b64encode(kw.encode("utf-8")),'utf-8')keyword=kw_bs64.replace('=','%3d')"这里就得到了最终所需要的url中keyword部分"url=server+keyword+'/'+str(page)+'-'+str(rule)+'.html'return urldef get_bsObj(url):headers={'Accept': '*/*','Accept-Language':'zh-CN,zh;q=0.9','User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Safari/537.36','Connection': 'keep-alive','Referer':'http://www.btwhat.info/'}req=Request(url,headers=headers)html=urlopen(req)# html=requests.get(url,headers=headers)bsObj=BeautifulSoup(html,'lxml')return bsObjdef get_htmlcode(url):headers={'Accept': '*/*','Accept-Language':'zh-CN,zh;q=0.9','User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Safari/537.36','Connection': 'keep-alive','Referer':'http://www.btwhat.info/'}req=Request(url,headers=headers)html=urlopen(req)return html.statusdef get_resource(bsObj):try :search_statu=bsObj.find('div',{'class':"search-statu"}).find('span').textprint(search_statu)if bsObj.find('div',{'class':'bottom-pager'}).find('span') is not None:page=bsObj.find('div',{'class':'bottom-pager'}).find('span').textelse:page='1'sort=bsObj.find('div',{'id':'sort-bar'}).find('b').textprint("page:"+page+"    sort by:"+sort)except:print("无法搜索该关键字")"emmm,测试时发现这个网站搜索‘苍井空’会弹出404,但是搜索‘仓井 空’或者‘仓井’都能出结果,所以加了一个异常处理"print("------------------------------------------------------------------------------------------")resource_box=bsObj.findAll('h3')for each in resource_box :js_URIencode=each.find('a').text# decode=re.search("\(.*\?)",js_URIencode)# 开始准备用正则表达式匹配,但是因为小括号太多,匹配表达式不好写,会报错,无法处理小括号情形,所以放弃了js_URIencode=js_URIencode.replace('document.write(decodeURIComponent(','')js_URIencode=js_URIencode.replace('"+"','')js_URIencode=js_URIencode.replace('));','')"用replace函数取出URIencode的部分""用paese.unquote解析出js_URIencode"resource_name=parse.unquote(js_URIencode)"到这里发现,名字中间会莫名穿插<b>和</b>,不知道是什么原因,删除掉就好"resource_name=resource_name.replace('<b>','').replace('</b>','')print(resource_name)resource_url='http://www.btwhat.info'+each.find('a').attrs['href']resource_bsObj=get_bsObj(resource_url)try:resource_hash=resource_bsObj.find('div',{'class':'panel-body'}).text"之前在这里选择是直接打印hash,后来发现上边那个韩语的页面404了,所以才加了一个异常处理"print(resource_hash.replace('\n',''))"有个小问题,为什么会空出上下各一行???用replace去掉换行,下边同理"resource_info=resource_bsObj.findAll('td')print ("File Type: "+resource_info[0].text.replace('\n',''),end=" ")"最后加个end=" "是为了输出不换行,排版美观"print ("||Create Time: "+resource_info[1].text.replace('\n',''),end=" ")print ("||Hot: "+resource_info[2].text.replace('\n',''),end=" ")print ("||File Size: "+resource_info[3].text.replace('\n',''),end=" ")print ("||File Count: "+resource_info[4].text.replace('\n','')+'\n')except:print("该资源已失效"+'\n')if __name__ == "__main__":kw="a better tomorrow"url=get_search_url(kw=kw,page=1,rule=1)bsObj=get_bsObj(url)get_resource(bsObj)

多加了一点打印信息,比如搜索结果数量,排序方式等等。都可以在上边找到对应的源码,很简单,大家可以自己动手尝试一下~

没有实现自动下载种子的功能,emmm这种东西是需要打印出来就行,自己再挑一挑,最终就是这个样子滴:

嘿嘿嘿,是不是感觉还不错呢~

结束语

ha,感觉写博客好累啊,像这样把思路想法一步步写出来感觉比写代码还麻烦。不过记录分享的同时也相当于又复习了一遍自己写的代码,也还是挺开心的,希望自己能继续努力吧,加油~

python编写的bt爬虫实践相关推荐

  1. python爬虫小说代码示例-中文编程,用python编写小说网站爬虫

    原标题:中文编程,用python编写小说网站爬虫 作者:乘风龙王 原文:https://zhuanlan.zhihu.com/p/51309019 为保持源码格式, 转载时使用了截图. 原文中的源码块 ...

  2. python爬虫简单实例-Python 利用Python编写简单网络爬虫实例3

    利用Python编写简单网络爬虫实例3 by:授客 QQ:1033553122 实验环境 python版本:3.3.5(2.7下报错 实验目的 获取目标网站"http://bbs.51tes ...

  3. python爬小说代码_中文编程,用python编写小说网站爬虫

    原标题:中文编程,用python编写小说网站爬虫 作者:乘风龙王 原文:https://zhuanlan.zhihu.com/p/51309019 为保持源码格式, 转载时使用了截图. 原文中的源码块 ...

  4. 用python爬虫下载视频_使用Python编写简单网络爬虫抓取视频下载资源

    我第一次接触爬虫这东西是在今年的5月份,当时写了一个博客搜索引擎,所用到的爬虫也挺智能的,起码比电影来了这个站用到的爬虫水平高多了! 回到用Python写爬虫的话题. Python一直是我主要使用的脚 ...

  5. 使用Python编写简单网络爬虫抓取视频下载资源

    我第一次接触爬虫这东西是在今年的5月份,当时写了一个博客搜索引擎.所用到的爬虫也挺智能的,起码比电影来了这个站用到的爬虫水平高多了! 回到用Python写爬虫的话题. Python一直是我主要使用的脚 ...

  6. python网页爬虫例子_Python 利用Python编写简单网络爬虫实例3

    by:授客 QQ:1033553122 实验环境 python版本:3.3.5(2.7下报错 实验目的 获取目标网站"http://bbs.51testing.com/forum.php&q ...

  7. 爬虫软件python彻底卸载_Python爬虫实践:如何优雅地删除豆瓣小组的帖子

    前言 文章起源于自己的一个需求:想要删除掉自己的若干个小号在豆瓣小组上的发帖及回复记录.这是一件看似简单的事情,但是一遍一遍的重复操作实在让我感到非常绝望,特别是删除自己的回复时,有时候回复的帖子的回 ...

  8. python 谷歌翻译_python爬虫实践之谷歌翻译

    目录 概述 爬取谷歌翻译,根据提供的文字进行翻译. 准备 所需模块 urllib.request execjs:执行JS代码的模块 涉及知识点 python基础 urllib模块基础 运行效果 控制台 ...

  9. Python编写知乎爬虫实例

    爬虫的基本流程 网络爬虫的基本工作流程如下: 首先选取一部分精心挑选的种子URL 将种子URL加入任务队列 从待抓取URL队列中取出待抓取的URL,解析DNS,并且得到主机的ip,并将URL对应的网页 ...

  10. python简单实践作业_【Python】:简单爬虫作业

    使用Python编写的图片爬虫作业: #coding=utf-8 import urllib import re def getPage(url): #urllib.urlopen(url[, dat ...

最新文章

  1. 【Linux网络编程】TCP
  2. des加密出的字符串有特殊字符吗_纯干货分享丨内网渗透很难学吗?
  3. 第一个cocos2d-x 项目
  4. docker搭建mysql主从
  5. java命令行执行编译好的类_Java命令行编译并执行Java程序
  6. 比亚迪汉鸿蒙系统测评_深度:预判比亚迪汉EV电驱动系统技术状态
  7. 推一个知乎学弱猹的公众号
  8. 使用Crash工具查看一个TCP listen sock内存布局实例
  9. oracle 存储过程详细介绍(创建,删除存储过程,参数传递等)1
  10. 谁提供一个能用的ICHAT文字聊天室程序,急需
  11. C#实现Astar 算法以及导航系统
  12. 802.11n无线网卡驱动linux,安装Broadcom Linux hybrid 无线网卡驱动总结
  13. linux常用的解压缩文件的命令
  14. 贝茜放慢脚步(寒假每日一题 14)
  15. 什么是Java(什么?Java?)
  16. win10打开Android模拟器后电脑重启问题
  17. 怪树林:胡杨的前世“血战场”
  18. 第三讲 关系数据模型
  19. flex局部的知识总结
  20. getTextSize()和putText()

热门文章

  1. 计算机量子化学计算焓变,中国科学技术大学超级计算中心
  2. 图像直方图规定化 matlab代码,MATLAB图像直方图规定化问题
  3. 实验一:marlab安装调试
  4. 模拟小型电子商务网站绘制ER图
  5. 一阶惯性环节如何实现跟踪性能与滤波性能共存(总)
  6. webQQ协议——模拟登录
  7. SCSI设备IO栈与块设备并发机制
  8. 如果机械工程师分等级的话,你在哪个等级,我是婴儿级
  9. 常见的软件测试方法有,常见的几种软件测试方法都有哪些
  10. 中国各省份边界json文件