Python 项目三 网络爬虫 01

文章目录

  • 一、简单粗暴认识爬虫(Spider)
    • 1、三种分类
    • 2、编写流程
    • 3、常用的基本方法
  • 二、开启第一个爬虫程序
    • 爬取网页
    • 爬取百度贴吧数据

送上大佬文章地址,一起学习,如有侵权请联系 http://c.biancheng.net/python_spider/what-is-spider.html

一、简单粗暴认识爬虫(Spider)

1、三种分类

通用网络爬虫

它是搜索引擎的重要组成部分,比如百度(Baiduspider)、搜狗( Sogouspider)、360浏览器 (360Spider)、谷歌搜索等等。通用网络爬虫需要遵守 robots 协议(君子协议,不具备法律效力),网站通过此协议告诉搜索引擎哪些页面可以抓取,哪些页面不允许抓取。

聚焦网络爬虫

是面向特定需求的一种网络爬虫程序,在网页抓取的时候会对网页内容进行筛选和处理,尽量保证只抓取与需求相关的网页信息。
聚焦网络爬虫极大地节省了硬件和网络资源,由于保存的页面数量少所以更新速度很快,这也很好地满足一些特定人群对特定领域信息的需求。

增量式网络爬虫

对已下载网页采取增量式更新,它是一种只爬取新产生的或者已经发生变化网页的爬虫程序,能够在一定程度上保证所爬取的页面是最新的页面,可以理解为实时更新。

2、编写流程

  • 先由 urllib 模块的 request 方法打开 URL 得到网页 HTML 对象

from urllib import request
urlopen()向URL发请求,返回响应对象
response=urllib.request.urlopen(‘http://www.baidu.com/’)

  • 使用浏览器打开网页源代码分析网页结构以及元素节点
  • 通过 Beautiful Soup 或则正则表达式提取数据
  • 存储数据到本地磁盘或数据库

3、常用的基本方法

urlopen() 向网站发起请求并获取响应对象
例子:response = urllib.request.urlopen(url,timeout)

Request() 用于创建请求对象、包装请求头,比如重构 User-Agent,headers:重构请求头
例子:urllib.request.Request(url,headers)

read() html响应对象方法
例子:response.read() # 返回结果为 bytes 数据类型

geturl() 返回响应对象的URL地址
例子:url = response.geturl()

getcode() 返回请求时的 HTTP 响应码
code = response.getcode()

encode() 字符串转换为字节码
string.encode(“utf-8”)

decode() 字节码转换为字符串
bytes.decode(“utf-8”)

urlencode() 实现对 url 地址的编码操作
例子:urllib.parse.urlencode({‘key’:‘value’}) #字典
注意:urllib.parse.quote(string) #字符串

unquote() 实现对 url 地址的解码操作

from urllib import parse
string = '%E7%88%AC%E8%99%AB'
result = parse.unquote(string)
print(result) #爬虫

二、开启第一个爬虫程序

爬取网页

from urllib import request
from urllib import parse

1、拼接URL地址

url = 'http://www.baidu.com/s?wd={}'
word = input('请输入搜索内容:')
params = parse.quote(word) #编码操作
full_url = url.format(params)

2、向URL发送请求,Request创建请求对象,重构请求头,urlopen发送请求并获取响应,read()响应对象

headers={'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:6.0) Gecko/20100101 Firefox/6.0'}
#创建请求对象,重构请求头
req = request.Request(url = full_url, headers = headers)
#向网站发送请求并获取响应对象
res = request.urlopen(req)
#响应对象方法
html = res.read().decode('utf-8')

3、保存本地

filename = word + '.html'
with open(filename,'w',encoding='utf-8') as f:
    f.write(html)

Python 项目三 网络爬虫 01_第1张图片
成功!
Python 项目三 网络爬虫 01_第2张图片
函数式编程

import urllib.parse
from urllib import parse
from urllib import request
# 1、拼接URL地址
def get_url(word):
    url = 'http://www.baidu.com/s?wd={}'
    params =urllib.parse.urlencode({'wd':word})
    full_url=url.format(params)
    return full_url
# 2、向URL发送请求
def request_url(full_url,filename):
    headers={'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:6.0) Gecko/20100101 Firefox/6.0'}
    #创建请求对象,重构请求头
    req = request.Request(url = full_url, headers = headers)
    #向网站发送请求并获取响应对象
    res = request.urlopen(req)
    #响应对象方法
    html=res.read().decode('utf-8')
    # 3、保存本地
    with open(filename,'w',encoding='utf-8') as f:
        f.write(html)
# 主程序,__name__内置变量,当前模块下才起作用
# if __name__ == '__main__'这条语句只有在__name__所对应的文件下才会满足条件
if __name__ == '__main__':
    word = input("请输入搜索内容:")
    full_url = get_url(word)
    filename = word + '.html'
    request_url(full_url,filename)

爬取百度贴吧数据

例:https://tieba.baidu.com/f?kw=python爬虫&pn=450

使用面向对象的编程方法(关于正则表达式的详细介绍在最上面链接有)

## 爬取百度贴吧数据
import urllib.request
from urllib import request, parse
import time
import random
from ua_info import ua_list  # 使用自定义的UA池


class TiebaSpider(object):
    # 初始化URL
    def __init__(self):
        # 定义常用变量,URL或计数变量
        self.url = 'http://tieba.baidu.com/f?{}'

    # 1.请求函数,得到页面
    def get_html(self, url):
        # 使用随机的UA
        headers = {'User-Agent': random.choice(ua_list)}
        # Request 创建请求对象,重构请求头
        req = urllib.request.Request(url=url, headers=headers)
        # urlopen 向网站发送请求并获取响应对象
        res = request.urlopen(req)
        # read()响应对象方法
        # windows会乱码,需要使用gbk解码,并使用ignore忽略不能处理的字节
        # linux可直接使用decode('utf-8')解码
        html = res.read().decode("gbk", "ignore")
        return html

    # 2、解析函数,需要用到解析模块,一般使用正则表达式
    def parse_html(self):
        pass

    # 3、保存文件函数
    def save_html(self, filename, html):
        with open(filename, 'w', encoding='utf-8') as f:
            f.write(html)

    # 4、主函数
    def run(self):
        name = input('输入贴吧名:')
        begin = int(input('输入起始页:'))
        stop = int(input('输入终止页:'))
        for page in range(begin, stop + 1):
            pn = (page - 1) * 50
            params = {
                'kw': name,
                'pn': str(pn)
            }
            # 拼接URL地址
            params = parse.urlencode(params)
            url = self.url.format(params)
            # 发请求
            html = self.get_html(url)
            # 定义路径
            filename = '{}-{}页.html'.format(name, page)
            self.save_html(filename, html)
            # 每爬取一个页面随机休眠1-2秒钟
            time.sleep(random.randint(1, 2))

if __name__ == '__main__':
    start = time.time()
    # 实例化对象
    spider = TiebaSpider()
    spider.run()
    end = time.time()
    print('程序执行时间:%.2f' % (end - start))

还没有结束=.=

你可能感兴趣的:(Python,爬虫,python)