写在前边
最近python爬虫大火,我这样一个java的忠实粉丝也忍不住去python官网看了看文档.搭环境写了几个demo.你还别说,真的给我一种很”锋利”的感觉,远比什么 c sharp 锋利的多.
简单的爬虫.
出于某种需要,我要爬一本单词,网址如下一本英文词典.我的目标是爬下所有的英文单词.说干就干!
先分析一下,这个单词书有2000多单词,分为16个网页: https://www.shanbay.com/wordbook/115978/123, 每个网页又分为10个page :https://www.shanbay.com/wordbook/115978/123?page=1.
我觉得构建这10*16个网页url还是直接在浏览器控制台构建好了.回顾了一下jquery的语法,写出代码如下:
1 2 3 4 5 6 7 8 9 10
| urls=[] for( i=0;i<$(".wordbook-wordlist-name").length;i++) { var url= $($(".wordbook-wordlist-name")[i].children[0]).attr('href') urls.push('https://www.shanbay.com'+url) } for(i=0;i<urls.length;i++) { for(j=1;j<11;j++) { console.log(urls[i]+'?page='+j) } }
|
得到了所有的url.然后找一个python download函数
1 2 3 4 5 6
| import urllib3 http = urllib3.PoolManager() def download(urlToDown): fp = http.request('GET',urlToDown) return fp.data.decode('utf-8');
|
下载一个html的content只需要4行!这里我不得不和java的对比一下(随手写的,不确定可以执行):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| import java.nio.charset.Charset; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpGet; import org.apache.http.client.methods.HttpUriRequest; import org.apache.http.client.methods.RequestBuilder; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClients; import org.apache.http.util.EntityUtils; private CloseableHttpClient httpclient = HttpClients.custom() .setDefaultCookieStore(cookieStore).build(); public String download(String url) { HttpGet httpget = new HttpGet(url); try { CloseableHttpResponse response3 = httpclient.execute(httpget); String content = EntityUtils.toString(response3.getEntity(), Charset.forName("utf8")); return content; } catch (Exception e) { return e.toString(); } }
|
然后是取目标单词.考虑在html中单词元素有特征如下:
1
| <td class="span2"><strong>wrapped</strong></td></code>
|
直接用正则就好了.
1 2 3 4 5 6
| allWord=[] def getWordFromUrl(shanBeiUrl): content= download(shanBeiUrl) words= re.findall('<td class="span2"><strong>(.*?)</strong></td>', content) allWord.extend(words) return
|
再加上循环和输出
1 2 3 4
| for shanbeiUrl in shanBeiUrls: getWordFromUrl(shanbeiUrl) print(allWord)
|
代码加一块不到20行!我的天!之前用java写类似的程序,花了半天的时间,定义了5个类,20几个方法.还美滋滋的认为自己面向对象了..以下是去年写的爬公司oa的java代码.
python和java的区别?
以我长达三小时的python学习来说.他们的区别有如下几点,
属性 |
java |
python |
语法 |
有些繁复. 另外为了命名清晰,函数和变量总是特别长. |
十分简单,没有花括号,不用加引号,使用缩进代替 各种命名都力求简洁 |
集合处理 |
难之又难,(每个操作) |
简单得很 |
库 |
很多很多,我从来没有遇到找不到想要的库找不到的情况 |
据说python以库多著称 |
使用范围 |
作为一个java的粉丝,我认为java适用范围很广,就算是写脚本也可以用groovy啊. |
这个比java还是差了点吧,至少2016毕业的时候以python为主的公司就遇到过3家 |
感触.
- 面向对象不是银弹,设计模式也不是.黑猫白猫.高效,稳定,快速,安全,可扩展的抓住老鼠的猫才是好猫.
- 估计某个项目会尝试使用python作为后台.请期待下一篇.