用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可以通过某些标签来直接查找。
(以爬取简书首页 文章标题,链接,阅读量,评论量为例)
![](https://img.haomeiwen.com/i938707/4f6d375ddf9a8770.png)
写出正则表达式:
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
![](https://img.haomeiwen.com/i938707/6bcb76bad22e917b.png)
完整代码:
#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会简单很多,里面也会用到正则。
就是这么简单,就是这么好用。
网友评论
——————————————————————————————
#coding=utf-8
import urllib,re
from bs4 import BeautifulSoup
import sys
reload(sys)
sys.setdefaultencoding( "utf-8" )
def getHtml(url):
page = urllib.urlopen(url)
html = page.read()
return html
def get_title():
html=getHtml('http://www.jianshu.com')
soup=BeautifulSoup(html,'lxml')
tags=soup.select('.note-list > li')
#return tags
return ['Title:%s\nView:%s\nComment:%s' %
(
tag.select('.title')[0].text,
tag.select('.meta > a')[1].text,
tag.select('.meta > span')[0].text
)
for tag in tags]
for i in get_title():
print i
#coding=utf-8
import urllib,re
from bs4 import BeautifulSoup
import sys
reload(sys)
sys.setdefaultencoding( "utf-8" )
def getHtml(url):
page = urllib.urlopen(url)
html = page.read()
return html
def get_title():
html=getHtml('http://www.jianshu.com')
soup=BeautifulSoup(html,'lxml')
tags=soup.select('.note-list > li')
#return tags
return ['Title:%s\nView:%s\nComment:%s' %
(
tag.select('.title')[0].text,
tag.select('.meta > a')[1].text,
tag.select('.meta > span')[0].text
)
for tag in tags]
for i in get_title():
#print i
print i
http://www.jianshu.com/p/0ba6a47cd722
鏈€鐖卞熀鏈鈥斺€旈璧风殑鏃ュ瓙绌块琛o紙濂虫€ц喘涔版寚鍗?璋柉鎺ㄨ崘锛?
闃呰 367
路 璇勮 7
路 鍠滄 15
http://www.jianshu.com/p/9feed5fb76bf
銆庡共璐с€忚亴鍦轰腑锛屾浛浜鸿儗浜嗛粦閿呰濡備綍鑷晳锛?
闃呰 124
路 璇勮 7
路 鍠滄 15
http://www.jianshu.com/p/c1f68cf064c0
涓€涓巻鍙插洿瑙傜兢浼椼€婃皯鍥戒汉鐗╄叮鍛虫潅璋堛€嬩笂绾?
闃呰 7011
路 璇勮 70
路 鍠滄 159