day062 爬虫简介及urllib2库的基本使用

今天学习爬虫,主要内容是简单了解爬虫的相关概念,urllib2库及常规使用,一个小功能:自定义爬取百度贴吧的多页内容。

爬虫相关概念

  • 爬虫是一种按照一定规则,用来自动抓取网页数据的程序或者脚本。抓取的数据可以经过过滤清洗后使用,存储。
  • 为什么要学习爬虫?

    • 1.当今网络上,数据量巨大,富含丰富的价值,抓取的到的数据经过处理分析后可以给之后的看到事务的发展趋势,规律。为之后的生产生活带来参考价值。如百度指数,阿里指数,微博指数,腾讯指数等。
    • 2.收集到的大量数据整理后,可以直接出卖,满足相关需求,产生价值。如各种数据提供商,云上贵州,数据堂等。
    • 3.有些情况下,实际的业务需要有针对性的数据,直接购买比较昂贵,可以通过网络爬虫,经济实惠的爬取一些有针对性的,有价值的信息,满足需求。如,在构建网站时,需要大量的风景图片以供展示,可以用爬虫爬取大量的图片以供筛选等。
  • 分类:

  • 一.通用爬虫:大型的搜索引擎(百度,谷歌)就含有通用爬虫系统。目的是将互联网上的各种网页下载到本地,形成互联内容的镜像。

    • 特点:优点:大而全 缺点:数据冗余,繁杂,对服务器及技术要求极高,不适用于中小企业。
  • 二.聚焦爬虫:面向“特定需求”的一种网络爬虫程序。有针对性,爬到的数据就是要用的数据。当然,需要对数据进行分析处理后使用。

    • 内容: 累积式爬虫;增量式爬虫;deep web爬虫
    • 特点:优点:小而快,目的明确,获取结果迅速,易于操作。 缺点:许多网站有反爬虫策略,需要和它们斗智斗勇;需要把握住度,不要逾越红线。
  • 爬虫具体能干什么?

    • 最本质的作用就是数据收集。具体收集的数据有什么用,怎么用,具体场景,具体分析。如,需要做一个小的视屏分享的服务器,那么就需要大量的,归类整理后视频。可以使用爬虫在网络上爬取大量的需求视频用来使用。
    • 12306抢票
    • 网站上的投票
    • 短信轰炸
    • 网络攻击
    • 等一系列在法律允许范围内的发送网络请求,响应数据的事情。
  • 流程:

# 聚焦爬虫主要流程.png

  • 在正式学习爬虫相关库的用法之前,需要清楚的回顾一遍HTTP请求原理,方式,过程。请求报文内容,响应报文内容,等知识点。

urllib2库

  • urllib2库是python2中用来发送网页请求的库。是爬虫的基础库。
  • urllib2库的基本使用步骤:
    • 1.获取url:注意完整的url格式:scheme://host[:port]/path/…/[?query-string][#anchor],多个参数,可以先放在字典里,然后用urllib.urlencode()转换为字符串后跟url拼接
    • 2.设置请求报文(更改User-Agent等):
    • 两种方式:
    • a 在字典里放好参数,然后以参数的形式导入urllib.Request(request={})中
    • b:使用给request对象添加请求头信息的方式:request.add_header()
    • 3.发送请求,返回响应对象:response = urllib2.urlopen(request)
    • 4.对返回数据进行解析处理,或直接输出使用,或存储到本地:存入本地可以使用:with open(‘<新建的文件名>’, ‘w’) as f f.write(data)语法

百度贴吧的爬取

  • 在遵循urllib库的基本使用流程的基础上,可以自定义爬取具体的某个贴吧,贴吧中的具体几页信息。
  • 实现步骤,先实现抓取一页的数据,再加入循环语句,多页抓取。
  • 最后要对代码进行提取封装成类和相关函数,使得代码更加简洁美观。
# -*- coding:utf-8 -*-
import urllib2, urllib
import random
from utils.user_agent_list import USER_AGENT_LIST
# 定义百度贴吧的爬虫类

class Spider_Baidu_Tieba(object):
    def __init__(self):
        self.base_url = 'http://tieba.baidu.com/f?'
        self.user_agent = random.choice(USER_AGENT_LIST)

    def start_spider(self):
        # 要爬的贴吧名
        tieba_name = raw_input('请输入你想要爬的贴吧名')
        # 开始的页数
        start_page = int(raw_input("请输入开始的页数"))
        # 结束的页数
        end_page = int(raw_input("请输入结束的页数"))
        # 页码与页码参数pn的关系:pn = (page_num-1)*50
        # 循环爬取需求页数的所有数据
        for page_num in range(start_page, end_page+1):
            # 创建url参数的字典集
            params = {
                'kw': tieba_name,
                'pn': (page_num-1)*50
            }
            # 将字典集转换成可以被浏览器识别的字符串形式
            params_str = urllib.urlencode(params)
            # 拼接完整url
            comp_url = self.base_url + params_str
            # 发送请求
            data = self.send_request(comp_url)
            # 保存数据到本地
            self.save_data(data, page_num)

    def send_request(self, comp_url):
        # 生成request对象
        request = urllib2.Request(comp_url)
        # 设置request的User_Agent
        request.add_header('User-Agent', self.user_agent)
        # 发送请求,返回响应对象
        response = urllib2.urlopen(request)
        # 将响应对象转译后返回
        data = response.read()
        return data

    def save_data(self, data, page_num):
        with open('./baidu_tieba_spider_data/page_%s.html'%page_num, 'w') as f:
            f.write(data)
        print "已完整第%s页的数据爬取..."%page_num

# 实例化爬虫对象
spider_baidu_tieba = Spider_Baidu_Tieba()

# 开始爬
spider_baidu_tieba.start_spider()

# 迈克尔杰克逊吧爬取结果.png

猜你喜欢

转载自blog.csdn.net/michael_cool/article/details/79875217