Python每天写1000字每天写500字

10行代码完成一个爬虫,就这么简单

2016-05-07  本文已影响7807人  向右奔跑

用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。

简单来说,正则表达式就是要描述出所要提取内容周边元素,采用模糊匹配的方式,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

总结:

  1. 对HTML网页结构要清晰。
  2. 正则表达式要熟悉,是提取数据的关键。
    使用BeautifulSoup会简单很多,里面也会用到正则。

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

上一篇下一篇

猜你喜欢

热点阅读