用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'<h4 class="title"><a target="_blank" href="(.*?)">(.*?)</a></h4>[\n][\s]+<div class="list-footer">[\n][\s]+<a target="_blank" href="/p/.*?">[\n][\s]+(.*?)[\n]</a>[\s]+<a target="_blank" href=".*?">[\n][\s]+(.*?)[\n]</a>[\s]+<span>(.*?)</span>'
(注意,有换行和空白)
用正则表达式去匹配,获得结果
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'<h4 class="title"><a target="_blank" href="(.*?)">(.*?)</a></h4>[\n][\s]+<div class="list-footer">[\n][\s]+<a target="_blank" href="/p/.*?">[\n][\s]+(.*?)[\n]</a>[\s]+<a target="_blank" href=".*?">[\n][\s]+(.*?)[\n]</a>[\s]+<span>(.*?)</span>'
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会简单很多,里面也会用到正则。
就是这么简单,就是这么好用。