• 用python做爬虫的多种方法选择


    S1.目标

    1. 抓取一个网页并分析,从而:
      • 得到半结构化数据,如抓取新浪微博一个页面中的内容。
      • 得到其他网页的指针,如抓取新浪微博中下一个页面。
      • 下载文件,如这次要下载PDF的任务。
    2. 多线程抓取与分布式抓取。
    3. 自动密钥破解。

    S2.方法概述

    有多少种方法可以用的呢?

    1.自己写

    urllib2+urlparse+re

    最原始的办法,其中urllib2是python的web库、urlparse能处理url、re是正则库,这种方法写起来比较繁琐,但也比较“实在”,具体可以参考[4].

    urllib2+beautifulsoup

    这里的得力干将是beautifulsoup[5],beautifulsoup可以非常有效的解析HTML页面,就可以免去自己用re去写繁琐的正则等。我比较喜欢这种方法,在下面具体讲解部分会详解。

    Mechanize+BeautifulSoup

    Mechanize是对于urllib2的部分功能的替换,使得除了http以外其他任何连接也都能被打开,也更加动态可配置,具体参考[6].

    PycURL,据说速度非常快,具体方法可以参考[1][2].

    2.公开库

    Scrapy

    (这一部分是后面补充的,该文章中的抓取方法以及其他部分不涉及此库)

    这里有一篇不错的使用介绍,当然,它的官方文档也是很不错的。

    这个库的使用很简单,效率也很高,比较推荐使用。

    其他更多的开源库参考[3].

    S3.具体讲解

    假设你已经把python安装好了(我用的版本是python2.7),现在我们用urllib2+BeautifulSoup的方法来抓取springerlink网站上的Computational Social Network Analysis和Computational Social Network,也就是上面提到的,这两本书。

    BeautifulSoup的安装,我是在Windows下安装的,官网上没有window下安装的教程,我是凭感觉装上的。它有一个setup.py,我就用"python.exe setup.py install"运行了,但提示"error: package directory 'bs4' does not exist",原来是默认python执行路径不在当前目录,而是在C盘下面的用户目录中,所以把bs4文件移动过去就好了。跑完好,生成一个build文件夹,我知道它肯定要放到Python文件下的LIB文件夹里面去,所以就把下面的bs4移到LIB中去,就可以了。以后要用,直接import即可。如果是linux用户装起来应该会更顺利些。

    用urllib2抓取网页/下载文件,urllib中最关键的可能就是urlopen这个函数了,返回的就是这个webpage/文件对象,可以用read等方法将其读出来。urlopen这个函数的参数可以是url也可以是Request,如下:

    req = urllib2.Request(url, headers={'User-Agent' : "Magic Browser"})

    webpage= urllib2.urlopen(req)

    webpage.read()...

    这里要注意的一点是headers={‘User-Agent’:'Magic Browser'},这个最好加上,否则的话,由于内部信息默认显示为机器代理,可能被服务器403 Forbidden拒绝访问,在抓取springelink.com上数据的时候不加上一定会被403毙掉的。

    用BeautifulSoup处理解析网页,import后,一切从soup = BeautifulSoup(webpage.read( ))开始,你可以用python的终端自己玩玩这个产生的soup对象。我这里就说下一种我比较喜欢的用法,详细具体的API参考[9].我喜欢用嵌套的方式来提取内容,什么意思呢,其实我认为大多数解析定位问题,其实就是下面这样一个问题:

    假设有一个页面如下:

    并且你已经用soup = BeautifulSoup()初始过了,现在你要根据

    这样的结构把下面所有的链接抽取出来,怎么做呢?比较简单的做法,就是一层一层向下分析,具体如下:

    top_div = soup.find('div', {'id':'a'}) #注意:返回的是list对象

    aa_div = top_div.findAll('div', {'class':'aa'}) #同样是list对象

    links = [div.findAll('a') for div in aa_div] #还是list对象

    links[0].get('href') ##

    links[0].contents #ff

    除了链接以外,其他内容也是通过类似的方法解析得到。(PS,我发现我若干个小时前自己还没解决这个问题的时候在SO上发的一个问题已经有人回答了,真好,那时候其实是困在了对list对象直接用find_all出错)

  • 相关阅读:
    Scala 插入排序
    win10下安装使用mysql-8.0.18
    Autofac注入多数据库(DbContext)
    缓存一致性问题以及方案(一) Redis
    Java编程中,一些好的习惯从一开始就值得坚持
    IDEA项目无法引用本地Class类,引用路径正确但报错标红
    git怎么撤销已经push到远端的commit?
    git的命令大全及如何修改git账号和提交的邮箱和用户名
    renren-fast-vue无法运行相关问题解决办法n ./src/assets/scss/index.scss Module build failed: Error: ENOENT: no su
    VsCode系列(一):下载安装及汉化
  • 原文地址:https://www.cnblogs.com/leonbond/p/3071116.html
Copyright © 2020-2023  润新知