Spider学习笔记01

/ 0评 / 1

1.网络爬虫概述

【1】定义
1.1) 网络蜘蛛、网络机器人,抓取网络数据的程序
1.2) 其实就是用Python程序模仿人点击浏览器并访问网站,而且模仿的越逼真越好

【2】爬取数据的目的
2.1) 公司项目的测试数据,公司业务所需数据
2.2) 获取大量数据,用来做数据分析

【3】企业获取数据方式
3.1) 公司自有数据
3.2) 第三方数据平台购买(数据堂、贵阳大数据交易所)
3.3) 爬虫爬取数据

【4】Python做爬虫优势
4.1) Python :请求模块、解析模块丰富成熟,强大的Scrapy网络爬虫框架
4.2) PHP :对多线程、异步支持不太好
4.3) JAVA:代码笨重,代码量大
4.4) C/C++:虽然效率高,但是代码成型慢

【5】爬虫分类
5.1) 通用网络爬虫(搜索引擎使用,遵守robots协议)
robots协议: 网站通过robots协议告诉搜索引擎哪些页面可以抓取,哪些页面不能抓取,通用网络爬虫需要遵守robots协议(君子协议)
示例: https://www.baidu.com/robots.txt
5.2) 聚焦网络爬虫 :自己写的爬虫程序

2.爬虫请求模块

2.1 requests模块

2.2 常用方法

3. URL地址拼接

3.1 拼接URL地址的三种方式

【1】字符串相加
【2】字符串格式化(占位符 %s)
【3】format()方法
    'http://www.baidu.com/s?{}'.format(params)
    
【练习】
    进入瓜子二手车直卖网官网 - 我要买车 - 请使用3种方法拼接前20页的URL地址,从终端打印输出
    官网地址:https://www.guazi.com/langfang/
    
url = 'https://www.guazi.com/dachang/buy/o{}/#bread'
for i in range(1, 21):
    page_url = url.format(i)
    print(page_url)

3.2 练习

在百度中输入要搜索的内容,把响应内容保存到本地文件

"""
在百度中输入要搜索的内容,把响应内容保存到本地文件
请输入关键字:赵丽颖
最终保存 赵丽颖.html 到本地文件
"""
import requests

# 1.拼接URL地址
keyword = input('关键字:')
url = 'http://tieba.baidu.com/s?wd={}'.format(keyword)
headers = {
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.104 Safari/537.36',
}

# 2.发请求获取响应内容(右键->查看网页源代码)
html = requests.get(url=url, headers=headers).content.decode('utf-8')

# 3.保存文件
filename = '{}.html'.format(keyword)
with open(filename, 'w') as f:
    f.write(html)

4. 百度贴吧爬虫

4.1 需求

1、输入贴吧名称: 赵丽颖吧
2、输入起始页: 1
3、输入终止页: 2
4、保存到本地文件:赵丽颖吧_第1页.html、赵丽颖吧_第2页.html

4.2 实现步骤

【1】查看所抓数据在响应内容中是否存在
    右键 - 查看网页源码 - 搜索关键字

【2】查找并分析URL地址规律
    第1页: http://tieba.baidu.com/f?kw=???&pn=0
    第2页: http://tieba.baidu.com/f?kw=???&pn=50
    第n页: pn=(n-1)*50

【3】发请求获取响应内容

【4】保存到本地文件

4.3 代码实现

"""
贴吧名:迪丽热巴吧
起始页:2
终止页:6
迪丽热巴吧_第2页.html  迪丽热巴吧_第3页.html .......

思路:
    1、确认数据来源:右键查看网页源代码,搜索关键字
    2、响应内容中存在:观察URL地址规律
    3、写程序
"""
import requests
import time
import random

class TieBaSpider:
    def __init__(self):
        """定义常用变量"""
        self.url = 'http://tieba.baidu.com/f?kw={}&pn={}'
        self.headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.104 Safari/537.36'}

    def get_html(self, url):
        """请求函数"""
        html = requests.get(url=url, headers=self.headers).text

        return html

    def parse_html(self):
        """解析函数"""
        pass

    def save_html(self, filename, html):
        """数据处理函数"""
        with open(filename, 'w', encoding='utf-8') as f:
            f.write(html)

    def crawl(self):
        """爬虫逻辑函数"""
        name = input('贴吧名:')
        start = int(input('起始页:'))
        end = int(input('终止页:'))
        for page in range(start, end + 1):
            # 脑海中闪现出self.url中有几个{} ?????
            pn = (page - 1) * 50
            page_url = self.url.format(name, pn)
            page_html = self.get_html(url=page_url)
            # 迪丽热巴吧_第2页.html
            filename = '{}_第{}页.html'.format(name, page)
            self.save_html(filename, page_html)
            print(filename, '抓取成功')
            # 控制数据抓取的频率
            time.sleep(random.randint(1, 2))

if __name__ == '__main__':
    spider = TieBaSpider()
    spider.crawl()

5. 正则解析模块re

5.1 使用流程

r_list=re.findall('正则表达式',html,re.S)

5.2 元字符

元字符 含义
. 任意一个字符(不包括\n)
\d 一个数字
\s 空白字符
\S 非空白字符
[] 包含[]内容
* 出现0次或多次
+ 出现1次或多次
  **********************************************
动物名称 :Rabbit
动物描述 :Small white rabbit white and white

- **页面结构如下**

  ```python
  <div class="animal">
      <p class="name">
            <a title="Tiger"></a>
      </p>
      <p class="content">
            Two tigers two tigers run fast
      </p>
  </div>
  
  <div class="animal">
      <p class="name">
            <a title="Rabbit"></a>
      </p>
  
      <p class="content">
            Small white rabbit white and white
      </p>
  </div>

6. 笔趣阁小说爬虫

6.1 项目需求

【1】官网地址:https://www.biqukan.cc/list/
    选择一个类别,比如:'玄幻小说'
    
【2】爬取目标
    '玄幻小说'类别下前20页的
    2.1》小说名称
    2.2》小说链接
    2.3》小说作者
    2.4》小说描述

6.2 思路流程

【1】查看网页源码,确认数据来源
    响应内容中存在所需抓取数据

【2】翻页寻找URL地址规律
    第1页:https://www.biqukan.cc/fenlei1/1.html
    第2页:https://www.biqukan.cc/fenlei1/2.html
    第n页:https://www.biqukan.cc/fenlei1/n.html

【3】编写正则表达式
    '<div class="caption">.*?<a href="(.*?)" title="(.*?)">.*?<small.*?>(.*?)</small>.*?>(.*?)</p>'
    
【4】开干吧兄弟

6.3 代码实现

"""
笔趣阁小说爬虫,所抓数据:href、title、author、comment
思路步骤:
    1、确认数据来源(右键->查看网页源代码->搜索关键字)
    2、确认静态:观察URL地址规律
    3、写正则表达式
"""
import requests
import re
import time
import random

class NovelSpider:
    def __init__(self):
        self.url = 'https://www.biqukan.cc/fenlei1/{}.html'
        self.headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.104 Safari/537.36'}

    def get_html(self, url):
        """请求,发请求获取响应内容html"""
        html = requests.get(url=url, headers=self.headers).text
        # 直接调用解析函数
        self.parse_html(html)

    def parse_html(self, html):
        """解析提取数据"""
        regex = '<div class="caption">.*?href="(.*?)" title="(.*?)">.*?<small class="text-muted fs-12">(.*?)</small>.*?>(.*?)</p>'
        # r_list: [(href,title,author,comment), (), ...]
        r_list = re.findall(regex, html, re.S)
        # 直接调用数据处理函数
        self.save_html(r_list)

    def save_html(self, r_list):
        """数据处理函数"""
        for r in r_list:
            print(r)

    def crawl(self):
        """爬虫逻辑函数"""
        for page in range(1, 3):
            page_url = self.url.format(page)
            self.get_html(url=page_url)
            # 控制数据抓取频率
            time.sleep(random.randint(1, 3))

if __name__ == '__main__':
    spider = NovelSpider()
    spider.crawl()

7. MySQL数据持久化

7.1 pymysql回顾

"""
笔趣阁小说爬虫,所抓数据:href、title、author、comment
思路步骤:
    1、确认数据来源(右键->查看网页源代码->搜索关键字)
    2、确认静态:观察URL地址规律
    3、写正则表达式
"""
import requests
import re
import time
import random
import pymysql

class NovelSpider:
    def __init__(self):
        self.url = 'https://www.biqukan.cc/fenlei1/{}.html'
        self.headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.104 Safari/537.36'}
        # 连接数据库、创建游标对象
        self.db = pymysql.connect(
            'localhost','root','123456','noveldb',charset='utf8'
        )
        self.cur = self.db.cursor()

    def get_html(self, url):
        """请求,发请求获取响应内容html"""
        html = requests.get(url=url, headers=self.headers).text
        # 直接调用解析函数
        self.parse_html(html)

    def parse_html(self, html):
        """解析提取数据"""
        regex = '<div class="caption">.*?href="(.*?)" title="(.*?)">.*?<small class="text-muted fs-12">(.*?)</small>.*?>(.*?)</p>'
        # r_list: [(href,title,author,comment), (), ...]
        r_list = re.findall(regex, html, re.S)
        # 直接调用数据处理函数
        self.save_html(r_list)

    def save_html(self, r_list):
        """数据处理函数"""
        ins = 'insert into novel_tab values(%s,%s,%s,%s)'
        for r in r_list:
            # execute():第二个参数可为列表、也可为元组
            self.cur.execute(ins, r)
            self.db.commit()
            print(r)

    def crawl(self):
        """爬虫逻辑函数"""
        for page in range(1, 3):
            page_url = self.url.format(page)
            self.get_html(url=page_url)
            # 控制数据抓取频率
            time.sleep(random.randint(1, 3))
        # 所有数据抓取完成后,断开数据库连接
        self.cur.close()
        self.db.close()

if __name__ == '__main__':
    spider = NovelSpider()
    spider.crawl()

8. 课后练习

【1】把百度贴吧案例重写一遍,不要参照课上代码
【2】笔趣阁案例重写一遍,不要参照课上代码
【3】复习任务
    pymysql、MySQL基本命令
    MySQL :建库建表普通查询、插入、删除等
    Redis : python和redis交互,集合基本操作
【4】猫眼电影top100数据抓取
    url地址:https://maoyan.com/board/4
    所抓数据:  电影名称
              电影主演
              上映时间
    数据处理:每个电影作为字典打印输出
    # 因频率过高出现滑块验证,则在页面中手动滑动滑块通过验证

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注