免责声明:本文章涉及到的应用仅供学习交流使用,不得用于任何商业用途,数据来源于互联网公开内容,没有获取任何私有和有权限的信息(个人信息等)。由此引发的任何法律纠纷与本人无关!禁止将本文技术或者本文所关联的Github项目源码用于任何目的。
写在前面:我一直在写爬虫,无论是最开始的大学时期的C# WinForm爬虫,还是Java爬虫,又或是Python爬虫,Android爬虫,到今天的Flutter爬虫。
爬虫
1.接口请求式
他们的原理始终都是一样的,那就是:
- 设置正常的浏览器User-Agent
- 处理好页面内容的缓存,避免相同地址下产生多次请求
- 处理好重定向
- 通过Chrome浏览器的F12功能进行界面标签的检索,一般找对应内容的class/id/tag等,判断可以根据tag的attribute进行筛选。当然如果Network能直接看到接口地址是最好的
- 通过恰当的XML解析库去解析Html标签,或者获取到的接口进行请求即可
- 对爬取到的数据进行存数据库或者展示在UI页面上
对于重定向下面有段代码,进行感受下
<html>
<head></head>
<body>
<script language="javascript">var url='';url= '2706' + url;url='_578'+url;url= '2522' + url;url= '9380' + url;url= '3415' + url;url= 'e5' + url;url= '555b' +url;url= '7e2' + url;url= 'd94' + url;url= 'b080' + url;url= '085bda4'+url;url= 'c0bc' + url;url= '=35ba' + url;url= '_CBK' + url;url= 't&_' +url;url= '&f=3&l=' + url;url= '1' + url;url= '='+ url;url= 'p' +url;url='?'+ url;url='sp'+ url;url='/w.a'+ url;;window.location=url;</script>
</body>
</html>
<!--对于这种如果只是短时间爬取请使用正则,如果长期的话,那么需要使用下面这种方式更稳定。
js很灵活,对网页开发人员来说,换这个代码形式是轻而易举的事情-->
2.浏览器模拟请求式
当然你也可以跳过这些繁琐的步骤,使用下列方式
- 在高级界面平台使用一个现实或者隐藏的WebView
- 对浏览器中的源代码进行拦截,在C#中使用WebBrowser,JavaFx中的WebView,Swing中的JWebBrowser,Android中的WebView,或者Flutter中的webview_flutter或者flutter_webview_plugin插件。拦截的方式可以是通过JavaScript桥接的方式进行对页面的输出(Android和Flutter下),或者直接通过API获取C#
- 通过这种方式有个好处,那就是不用处理某些网站防爬虫的机制,比如第一个访问的页面仅仅嵌入了一段跳转的代码,而第二个页面又是跳转的代码(JavaScrip的window.location 或者 meta刷新标签),这是很烦人的处理
这样的方式有好处但是页有缺点,那就是相比第一种会请求很多不必要的资源,比如图片,Js等等文件。所以一般很少有用这种
爬虫项目
1.迅雷账号抓取器(C# WinForm)
2.AD公司所有可申请样片芯片爬取(Java)
3.QQ音乐爬取(Python)
4.NASA图片获取
5.股票实时曲线
Python将数据处理,通过WebSocket传给H5用于展示
6.脚本之家电子书爬虫(Android APP)
7.多个图片网站爬虫(Android)
包含ACG动漫,美女图片资源网站等网站的聚合。
他们都一般形式是Tab分类+列表+图片详情页,接口编程,只需处理解析部分代码
页面是单页一张图片,我们是展示所有图片,并且支持缩放查看大图(不担心OOM),一键下载和分享功能
8.Flutter美女图片爬虫(Flutter)
特点:
- 漂亮的UI,操作更加便捷,手机端查看,支持iOS和Android
- 支持一键下载到文件夹,查看大图,左右滑动切换分类,漂亮的Loading
- 支持浏览器打开,分享功能
聚合助手(Flutter)
这或许是个人项目中我做过的最漂亮的APP
特点:
- 漂亮的UI,操作更加便捷,手机端查看,支持iOS和Android;
- UI设计均出自我的手,我本身具有扎实的PS技能和审美功底;
- 支持筛选,搜索,一键唤起迅雷下载(边看边播),这可能是最友好的方案;
- 支持从图片取色,类似Android中的Palette API,来生成详情页的背景色;
- 支持查看网页源码,外部浏览器查看,二维码分享,清空缓存,访问接口数统计等功能
有人问:你不是大废周折吗?直接通过手机浏览器访问不是一样吗?
我回答:你错了,原因有三:
第一,这个网站看起来就像是上个世纪的风格,我的应用UI水平不能说最好,但是也是我精心打磨,里面包含了我的很多想法,我之前做过很多Logo,海报设计,我对TerribleUI敏感,见过很多好看的页面设计;
第二,我不希望通过浏览器去输入网址,浏览器导航当返回又进入新的页面会重新加载,而我的应用可以直接取缓存,看过的页面不会加载第二次;
第三,我很享受用尽量少的脚本去处理一些繁琐的事情的过程
9.某查查批量查询企业信息并存表格(Python)
10.抢房源(Python)
这个是一键抢房源的神器,到点自动抢房源
11.央视纪录片爬取
支持生成csv表格
import requests,csv
def write(programs):
with open("dic.csv",'a',newline='',encoding='utf-8-sig') as datacsv:
csvwriter = csv.writer(datacsv,dialect={'excel'})
for l in programs:
csvwriter.writerow([l['vsid'],l['relvsid'],l['name'],l['fl'],l['desc'],l['sbsj'],l['url'],l['img'],l['cd'],l['zy'],l['bj'],l['dy'],l['js'],l['nf'],l['yz'],l['playdesc']])
def get_data(index):
url = "http://api.cntv.cn/videoset/vsetlist"
req = requests.get(url=url,params={'serviceId':'cbox','cid':'CN08','l':'','p':index,'z':''})
if req.status_code == 200:
j = req.json()
if 'errcode' in j:
return False
else:
print(j)
write(j['list'])
return True
else:
print("Error:"+req.url)
return False
if __name__ == "__main__":
with open("dic.csv",'a',newline='',encoding='utf-8-sig') as datacsv:
csvwriter = csv.writer(datacsv,dialect={'excel'})
csvwriter.writerow(['vsid','relvsid','name','fl','desc','sbsj','url','img','cd','zy','bj','dy','js','nf','yz','playdesc'])
for i in range(1,100):
res = get_data(i)
if not res:
print("Error at "+str(i))
break
print(str(i)+" is finished.")