python爬虫初体验

Author Avatar
贾康 7月 22, 2017

写在前边

最近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代码.
upload successful

python和java的区别?

以我长达三小时的python学习来说.他们的区别有如下几点,

属性 java python
语法 有些繁复.
另外为了命名清晰,函数和变量总是特别长.
十分简单,没有花括号,不用加引号,使用缩进代替
各种命名都力求简洁
集合处理 难之又难,(每个操作) 简单得很
很多很多,我从来没有遇到找不到想要的库找不到的情况 据说python以库多著称
使用范围 作为一个java的粉丝,我认为java适用范围很广,就算是写脚本也可以用groovy啊. 这个比java还是差了点吧,至少2016毕业的时候以python为主的公司就遇到过3家

感触.

  1. 面向对象不是银弹,设计模式也不是.黑猫白猫.高效,稳定,快速,安全,可扩展的抓住老鼠的猫才是好猫.
  2. 估计某个项目会尝试使用python作为后台.请期待下一篇.