python——爬虫

网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。另外一些不常使用的名字还有蚂蚁、自动索引、模拟程序或者蠕虫。

 

爬虫:

  客户端:

    Web应用本质

    APP

  服务器:

    URL -> API

 注:服务器提供API,URL有个专有名词叫API

 

自动程序(爬虫):

  起始URL:

    https://www.cnblogs.com/

    下载源码:

<!DOCTYPE html>
    <html lang="zh-cn">
    <head>
        <meta name="viewport" content="width=device-width, initial-scale=1"><meta charset="utf-8">
        <title>博客园 - 开发者的网上家园</title>
        <meta name="k
        ...

     --- 获取关键字,收录到数据库 -

    -- 再获取其他URL,href

    再继续访问......

  requests.post(...)

 

自动登录需要注意几点:

1、登录时提交用户信息

2、接收返回值或者cookie

3、携带cookie或者返回值,再去访问

 

自动登录网站的几种认证方式:

  第一次获取cookie

    登录:cookie授权

  ....

 

  第一次访问:什么都不给

    登录:登录成功后,再给字符串

 

python爬虫几个步骤:

1、发送请求

  - 需要验证

  - 无需验证

2、获取内容

  正则表达式,分类+分组

  //div[@class='item_list']

  //div[@class='item_list']/div

  //div[@class='item_list']//span

  //div[@class='item_list']//a/text()

  //div[@class='item_list']//img/@

3、获取其他URL

  //a/@href

4、自动递归请求url,重复执行1、2、3步操作

##############scrapy##############

 1、安装

  依赖:Twisted

  基于python2.7做

  

  pip install scrapy

  windows依赖模块:

        pywin32

  安装python2.7

    python-2.7.11.msi

    python-2.7.11.adm64.msi

    ==> 环境变量 C:\python27   C:\python27\Script

  装pip

  安装steuptools 

    https://bootstrap.pypa.io/ez_setup.py

    ez_setup.py

    python ez_setup.py

  pip(下载pip源码进行解压安装)

    https://pypi.python.org/packages/11/b6/abcb525026a4be042b486df43905d6893fb04f05aac21c32c638e939e447/pip-9.0.1.tar.gz#md5=35f01da33009719497f01a4ba69d63c9

    解压

    进入模块

    python setup.py install

  pip install requests

 

  pip install scrapy

    scrapy需要装的一些依赖:

      VCForPython27.msi

 

      pywin32-220.win-amd64-py2.7.exe

      pypiwin32-219.win32-py2.7.exe

 

      lxml-2.3.win-amd64-py2.7.exe

      lxml-2.3.win32-py2.7.exe

 

 

    

    pip install scrapy

 

2、使用

  环境变量:C :\python27\scrapy

  scrapy startproject spiderl

  创建spider文件(APP)

    -name = ''nnnnn"

    -start_urls

    -parse

3、 scrapy crawl spider_name --nolog    #nolog不要显示日志

 **********************

scrapy

1、project

2、app,爬虫

  - name

  - start_urls

  - parse

3、crawl name --nolog

4、parse

  直接处理请求:

    selector:

      //   #表示子子孙孙

      /  #从孩子里找

      //div[@class='c1']   #表示属性选择器

      //div[@class='c1'][@id='i1']   #两个属性

      //div//img/@src     获取img下的src属性

      //div//a[1]

      //div//a[1]//text()  #找a标签里面内容

      ====支持正则表达式

      //div/a

 

 


Requests

Python标准库中提供了:urllib、urllib2、httplib等模块以供Http请求,但是,它的 API 太渣了。它是为另一个时代、另一个互联网所创建的。它需要巨量的工作,甚至包括各种方法覆盖,来完成最简单的任务。

import urllib2
import json
import cookielib


def urllib2_request(url, method="GET", cookie="", headers={}, data=None):
    """
    :param url: 要请求的url
    :param cookie: 请求方式,GET、POST、DELETE、PUT..
    :param cookie: 要传入的cookie,cookie= 'k1=v1;k1=v2'
    :param headers: 发送数据时携带的请求头,headers = {'ContentType':'application/json; charset=UTF-8'}
    :param data: 要发送的数据GET方式需要传入参数,data={'d1': 'v1'}
    :return: 返回元祖,响应的字符串内容 和 cookiejar对象
    对于cookiejar对象,可以使用for循环访问:
        for item in cookiejar:
            print item.name,item.value
    """
    if data:
        data = json.dumps(data)

    cookie_jar = cookielib.CookieJar()
    handler = urllib2.HTTPCookieProcessor(cookie_jar)
    opener = urllib2.build_opener(handler)
    opener.addheaders.append(['Cookie', 'k1=v1;k1=v2'])
    request = urllib2.Request(url=url, data=data, headers=headers)
    request.get_method = lambda: method

    response = opener.open(request)
    origin = response.read()

    return origin, cookie_jar


# GET
result = urllib2_request('http://127.0.0.1:8001/index/', method="GET")

# POST
result = urllib2_request('http://127.0.0.1:8001/index/',  method="POST", data= {'k1': 'v1'})

# PUT
result = urllib2_request('http://127.0.0.1:8001/index/',  method="PUT", data= {'k1': 'v1'})
封装urllib请求

Requests 是使用 Apache2 Licensed 许可证的 基于Python开发的HTTP 库,其在Python内置模块的基础上进行了高度的封装,从而使得Pythoner进行网络请求时,变得美好了许多,使用Requests可以轻而易举的完成浏览器可有的任何操作。

 


Scrapy

Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架(类似Django)。
其最初是为了页面抓取 (更确切来说, 网络抓取 )所设计的, 也可以应用在获取API所返回的数据(例如 Amazon Associates Web Services ) 或者通用的网络爬虫。

Scrapy用途广泛,例如:

  • 数据挖掘
  • 信息处理
  • 存储历史数据
  • 监测
  • 自动化测试
  • ...

详细参考:http://scrapy-chs.readthedocs.io/zh_CN/0.24/intro/overview.html

Scrapy 使用了 Twisted异步网络库来处理网络通讯。整体架构大致如下

Scrapy主要包括了以下组件:

  • 引擎(Scrapy)
    用来处理整个系统的数据流处理, 触发事务(框架核心)
  • 调度器(Scheduler)
    用来接受引擎发过来的请求, 压入队列中, 并在引擎再次请求的时候返回. 可以想像成一个URL(抓取网页的网址或者说是链接)的优先队列, 由它来决定下一个要抓取的网址是什么, 同时去除重复的网址
  • 下载器(Downloader)
    用于下载网页内容, 并将网页内容返回给蜘蛛(Scrapy下载器是建立在twisted这个高效的异步模型上的)
  • 爬虫(Spiders)
    爬虫是主要干活的, 用于从特定的网页中提取自己需要的信息, 即所谓的实体(Item)。用户也可以从中提取出链接,让Scrapy继续抓取下一个页面
  • 项目管道(Pipeline)
    负责处理爬虫从网页中抽取的实体,主要的功能是持久化实体、验证实体的有效性、清除不需要的信息。当页面被爬虫解析后,将被发送到项目管道,并经过几个特定的次序处理数据。
  • 下载器中间件(Downloader Middlewares)
    位于Scrapy引擎和下载器之间的框架,主要是处理Scrapy引擎与下载器之间的请求及响应。
  • 爬虫中间件(Spider Middlewares)
    介于Scrapy引擎和爬虫之间的框架,主要工作是处理蜘蛛的响应输入和请求输出。
  • 调度中间件(Scheduler Middewares)
    介于Scrapy引擎和调度之间的中间件,从Scrapy引擎发送到调度的请求和响应。

Scrapy运行流程大概如下:

    1. 引擎从调度器中取出一个链接(URL)用于接下来的抓取
    2. 引擎把URL封装成一个请求(Request)传给下载器
    3. 下载器把资源下载下来,并封装成应答包(Response)
    4. 爬虫解析Response
    5. 解析出实体(Item),则交给实体管道进行进一步的处理
    6. 解析出的是链接(URL),则把URL交给调度器等待抓取

 

python爬虫链接详细参考:http://www.cnblogs.com/wupeiqi/articles/5354900.html

#################################################################

爬虫博客推荐(python2.7):http://www.cnblogs.com/xin-xin/p/4297852.html

posted @ 2017-01-11 08:43  Yared  阅读(334)  评论(0编辑  收藏  举报