美文网首页Python每天写1000字每天写500字
10行代码完成一个爬虫,就这么简单

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

作者: 向右奔跑 | 来源:发表于2016-05-07 02:41 被阅读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。

    • 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
    

    总结:

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

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

    相关文章

      网友评论

      • 9c2f1c073a03:每次看的文章正则都写的好长,电脑反应不过来
      • 第61装甲师:您好,我看了一下您的代码,有些问题还想向您学习一下,能给个联系方式吗?
        向右奔跑:@第61装甲师 微信 yong164647
      • 麦口胡:用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
      • 2018做个有趣的人:Python正则表达式中,(.*?)表示什么,[\n],[\s]表示什么?
        麦口胡:[\n],[\s] 换行和空格
      • Vector_07:博主,我用了scrapy采集到相关数据了,但是只采集到了20个,之后的下滑触发更多请求和再往下滑到【加载更多】按钮,这个怎么处理?这个是不是用到JS了?
        b65bea639bdb:@向右奔跑 也遇到这个问题,求教
        向右奔跑:@简书_小助手 这个有点复杂,两三句就不清楚,我写篇文章
      • 9c8e65ce682b:看了也照着做了 但是新的简书的html页面改变了 我想匹配更多的正则直接提取从标题到喜欢所有的内容之后再拆分,现在还在调正则表达式 但是思路已经明白了 。
        麦口胡:用beautiful4抓取新版的代码

        #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
        向右奔跑:@冬天的茶茶 是的,这是以前旧的网站。加油~
      • vansnowpea:运行出来怎么都是乱码的:
        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
        星期四晚八点:@vansnowpea 字符集的问题吧
      • dba2ebfecc80:为什么不用py3呢?
        向右奔跑:@复写纸 目前都用py27, mac自带的。之前用过py3
      • sherryup:需不需要专门学网页结构?认识class=之类的含义呢?还是了解一下大致结构就行?
        向右奔跑: @sherryup 哈哈哈,那HTML都不用学了,看看就好。我去试试
        sherryup:@向右奔跑 Chrome有一个很好用的插件Infolite,鼠标到哪儿,就能显示对应html标签名,跟requests搭配很方便
        向右奔跑: @sherryup 需要了解一些,比较简单,HTML都是层级结构。用chrome开发者工具很方便,可以开始定位到你要提取的网页元素,我后面的文章中有。
      • 3625cdff19be:还是喜欢直接去扒接口
        向右奔跑:@3625cdff19be 👍 介绍一下哈
      • 张鹏业:看样子是python代码,
        向右奔跑: @张鹏业 就是Python啊
      • 清焰一:虽然看不懂,但感觉很6😊
        向右奔跑:@流年皎兮 学起来,蛮简单的

      本文标题:10行代码完成一个爬虫,就这么简单

      本文链接:https://www.haomeiwen.com/subject/udwjrttx.html