用Python开发一个简单爬虫非常简单,10多行代码即可完成,实现功能。

1、获取网页代码

就是将互联网上URL对应的网页下载到本地(内存)中。再进行内容分析和提取。

这部分要实现的功能,相当于浏览器,当我们在浏览器上输入一个URL地址,是向远程服务器发送一个请求,远程服务器把源代码通过网络传送到客户端的浏览器,由浏览器进行解析呈现。我们通常在网页上右键--“显示网页源代码”,看到的代码就是服务器端传输过来的。现在要以编程的方式拿到这些代码。

获取网页的方式,有urlib, urllib2, requests三种方法。

urlib和urllib2是Python提供的基础模块。 requests是Python提供的第三方库,功能更为强大。

urllib2

can accept a Request object to set the headers for a URL request,urllib

accepts only a URL. That means, you cannot masquerade your User Agent string etc.

urllib2可以接受一个Request类的实例来设置URL请求的headers,urllib仅可以接受URL。这意味着,你不可以伪装你的User Agent字符串等。

(就是用urllib2可以提交Cookie数据,实现模拟登录)

urllib

provides the urlencode method which is used for the generation of GET query strings, urllib2

doesn't have such a function. This is one of the reasons why urllib

is often used along with urllib2

urllib提供urlencode方法用来GET查询字符串的产生,而urllib2没有。这是为何urllib常和urllib2一起使用的原因。

看一下实现的代码,共4行代码,使用的是urllib2:

def getHtml(url):

page = urllib.urlopen(url)

html = page.read()

return html

拿到代码可以在控制台打印输出看一下。

2、提取相应内容

就是对拿到的网页源代码进行匹配,检索解析出需要的内容。如爬取网站上所有的图片,就是要分析出图片的url(img 标签的 src)

网页解析,提取内容的方式有正则表达式,BeautifulSoup,XPath。

Beautiful Soup是Python的一个库,最主要的功能是从网页抓取数据。

XPath 是一门在 XML 文档中查找信息的语言。XPath 可用来在 XML 文档中对元素和属性进行遍历。

简单来说,正则表达式就是要描述出所要提取内容周边元素,采用模糊匹配的方式,XPath是指定一个路径来查找所要的内容。

拿到数据的关键是要熟悉网页的结构。XPath 是需要知道文档的层级结构, Beautiful Soup可以通过某些标签来直接查找。

(以爬取简书首页 文章标题,链接,阅读量,评论量为例)


这是文档中文章 标签及结构

写出正则表达式:

reg = r'
(.*?)
[\n][\s]+ 
 

   [\n][\s]+ 
  [\n][\s]+(.*?)[\n][\s]+ 
  [\n][\s]+(.*?)[\n][\s]+ 
  (.*?)' 
  
(注意,有换行和空白)
用正则表达式去匹配,获得结果
hotre = re.compile(reg)
artlist = re.findall(hotre, html)

3、输出分析内容

进行统计,输出到Excel或其他文件、数据库中。

以控制台的打印输出为例:

for article in artlist:
for com in article:
if com.startswith("/p/"):
print "http://www.jianshu.com"+com
else:
print com

爬取的数据
完整代码:
#coding=utf-8
import re
import urllib
def getHtml(url):
page = urllib.urlopen(url)
html = page.read()
return html
html = getHtml("http://www.jianshu.com")
reg = r'
(.*?)
[\n][\s]+ 
  

    [\n][\s]+ 
   [\n][\s]+(.*?)[\n][\s]+ 
   [\n][\s]+(.*?)[\n][\s]+ 
   (.*?)' 
   
hotre = re.compile(reg)
artlist = re.findall(hotre, html)
for article in artlist:
for com in article:
if com.startswith("/p/"):
print "http://www.jianshu.com"+com
else:
print com

总结:

对HTML网页结构要清晰。

正则表达式要熟悉,是提取数据的关键。

使用BeautifulSoup会简单很多,里面也会用到正则。

就是这么简单,就是这么好用。