美文网首页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会简单很多,里面也会用到正则。

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

相关文章

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

    用Python开发一个简单爬虫非常简单,10多行代码即可完成,实现功能。 1、获取网页代码 就是将互联网上URL对...

  • Python爬虫的基本操作:单页面单目标、单页面多目标、多页面多

    什么是爬虫,这就是爬虫: 加上注释不到20行代码,你就完成了一个爬虫,简单吧 怎么写爬虫 网页世界多姿多彩、亿万网...

  • python爬虫

    简单网页爬虫 上面的代码是一个简单的网页爬虫代码: urllib.request.urlopen('http://...

  • 简单爬虫代码

    import urllib.request import gevent from gevent import mo...

  • webmagic+Xpath实现简单爬取

    webmagic是一个简单上手的爬虫框架,提供简单灵活的API,只需少量代码即可实现一个爬虫 一、引入jar包 二...

  • 爬虫

    学爬虫有点崩溃。 有什么简单的爬虫代码。简单容易懂的爬虫代码。一直在找,看。终于自己会了一点。 需要下载用Beau...

  • 爬虫笔记(2)入门

    1.爬虫结构 从爬虫的结构上来看,追简单的爬虫包括任务队列、页面下载和页面解析三个部分。 上面代码实现了一个简单的...

  • 2019-04-01

    简单爬虫 以下是一个爬取猫眼电影top100的简单小爬虫代码,也简单记录一下我的新手学习之路。 import re...

  • 使用 superagent 与 cheerio 完成简单爬虫

    使用 superagent 与 cheerio 完成简单爬虫

  • Node完成简单爬虫

    编写好node代码,终端运行node app.js后 页面显示json数据 [ { "title":"【活动+视...

网友评论

  • 9c2f1c073a03:每次看的文章正则都写的好长,电脑反应不过来
  • 9307994aef48:您好,我看了一下您的代码,有些问题还想向您学习一下,能给个联系方式吗?
    向右奔跑:@第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