IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> 网络爬虫(一) -> 正文阅读

[Python知识库]网络爬虫(一)

网络爬虫(一)

关键字:爬虫,数据分析,数据存储

一、 网络爬虫总体步骤

  • 步骤一:确认数据的来源,网页的具体地址
  • 步骤二:观察url地址规律,
  • 步骤三:写正则表达式或者XPATH表达式等方式匹配抓取信息
  • 步骤四:写具体的爬虫程序

二、以豆瓣为例子(使用正则)

import re
import time
import random
import requests

class DoubanBookSpider:
    def __init__(self):
        self.url = "https://book.douban.com/top250?start={}"
        self.headers = {"User-Agent": "Mozilla/5.0 (X11; Linux x86_64) ""AppleWebKit/537.36 (KHTML, like Gecko) ""Chrome/80.0.3987.116 Safari/537.36"}

    def get_html(self,url):
        # 发请求获取html
        return requests.get(url=url,headers =self.headers).text

    def parse_html(self,html):
        # 正则解析提取数字
        # regex = '<table width="100%">.*?title="(.*?)">.*?<p class="pl">(.*?)</p>.*?<span class="rating_nums">(.*?)</span>.*?<span class="pl">(.*?)</span>.*?<span class="inq">(.*?)</span>'
        regex = '<td valign="top">.*?title="(.*?)".*?<p class="pl">(.*?)</p>.*?<span class="rating_nums">(.*?)</span>.*?<span class="pl">(.*?)</span>.*?<span class="inq">(.*?)</span>'
        # book_list[(书名 信息 评分,人数,描述)()()......]
        book_list = re.findall(regex,html,re.S)
        for book in book_list:
            # print(book[0][:book[0].find('"')])
            item = {}
            item["book_name"] = book[0]
            item["book_info"] = book[1]
            item["book_score"] = book[2]
            item["book_number"] = book[3][1:-1].strip()
            item["book_desc"] = book[4]
            print(item)

    def save_html(self):
        pass

    def crawl(self):
        for page in range(1,11):
            page_url = self.url.format((page-1)*25)
            html = self.get_html(page_url)
            self.parse_html(html)
            # 控制抓取频率
            time.sleep(random.randint(1,2))

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

三、爬取数据的存储方式

1、mysql存储

在初始化函数中需要创建数据库和游标对象

import re
import time
import random
import requests
# 导入pymysql库
import pymysql
class DoubanBookSpider:
    def __init__(self):
        self.url = "https://book.douban.com/top250?start={}"
        self.headers = {
            "User-Agent": "Mozilla/5.0 (X11; Linux x86_64) ""AppleWebKit/537.36 (KHTML, like Gecko) ""Chrome/80.0.3987.116 Safari/537.36"}
        # 创建数据库对象和游标对象
        self.db = pymysql.connect(host='localhost', user="root", password='123456', database='bookdb', charset='utf8')
        self.cur = self.db.cursor()
        self.ins = 'insert into booktab values(%s,%s,%s,%s,%s)'

获取请求不变,在正则解析的过程中,需要存入数据库

def parse_html(self, html):
        # 正则解析提取数字
        # regex = '<table width="100%">.*?title="(.*?)">.*?<p class="pl">(.*?)</p>.*?<span class="rating_nums">(.*?)</span>.*?<span class="pl">(.*?)</span>.*?<span class="inq">(.*?)</span>'
        regex = '<td valign="top">.*?title="(.*?)".*?<p class="pl">(.*?)</p>.*?<span class="rating_nums">(.*?)</span>.*?<span class="pl">(.*?)</span>.*?<span class="inq">(.*?)</span>'
        # book_list[(书名 信息 评分,人数,描述)()()......]
        book_list = re.findall(regex, html, re.S)
        for book in book_list:
            # print(book[0][:book[0].find('"')])
            item = {}
            item["book_title"] = book[0]
            item["book_info"] = book[1]
            item["book_score"] = book[2]
            item["book_number"] = book[3][1:-1].strip()
            item["book_desc"] = book[4]
            print(item)
        # 存入mysql数据库
        li = [
            item["book_title"],
            item["book_info"],
            item["book_score"],
            item["book_number"],
            item["book_desc"],
        ]
        # 添加数据的那个mysql中
        self.cur.execute(self.ins, li, )
        # 上传
        self.db.commit()

最后需要关闭数据库和游标

 def crawl(self):
        for page in range(1, 11):
            page_url = self.url.format((page - 1) * 25)
            html = self.get_html(page_url)
            self.parse_html(html)
            # 控制抓取频率
            time.sleep(random.randint(1, 2))
        # 当所有的数据执行完毕,完毕数据库和游标
        self.cur.close()
        self.db.close()

2、使用Mongo数据库(比较简单)

在初始化函数中,创建mango数据库的库和集合名

import re
import time
import random
import requests
# 导入pymongo库
import pymongo
class DoubanBookSpider:
    def __init__(self):
        self.url = "https://book.douban.com/top250?start={}"
        self.headers = {
            "User-Agent": "Mozilla/5.0 (X11; Linux x86_64) ""AppleWebKit/537.36 (KHTML, like Gecko) ""Chrome/80.0.3987.116 Safari/537.36"}
        # 链接数据库
        self.conn = pymongo.MongoClient(host="localhost", port=27017)
        #创建数据库名字
        self.db = self.conn["bookdb"]
        #创建集合名字
        self.myset = self.db["bookset"]       

将数据存入到数据库中注意,这里Mongo数据是以键值对存储到集合中,所以存储的数据需是集合形式

def parse_html(self, html):
        regex = '<td valign="top">.*?title="(.*?)".*?<p class="pl">(.*?)</p>.*?<span class="rating_nums">(.*?)</span>.*?<span class="pl">(.*?)</span>.*?<span class="inq">(.*?)</span>'
        book_list = re.findall(regex, html, re.S)
        for book in book_list:
            item = {}
            item["book_name"] = book[0]
            item["book_info"] = book[1]
            item["book_score"] = book[2]
            item["book_number"] = book[3][1:-1].strip()
            item["book_desc"] = book[4]
            print(item)
            # 把数据存入mongodb数据库
            self.myset.insert_one(item)

3、存入到CSV文件之中

打开一个CSV文件,并初始化CSV文件

import re
import time
import random
import requests
#导入CSV文件库
import csv
class DoubanBookSpider:
    def __init__(self):
        self.url = "https://book.douban.com/top250?start={}"
        self.headers = {
            "User-Agent": "Mozilla/5.0 (X11; Linux x86_64) ""AppleWebKit/537.36 (KHTML, like Gecko) ""Chrome/80.0.3987.116 Safari/537.36"}
        #  打开文件,并初始化csv文件
        self.f = open("douban_book.csv", "w")
        self.write = csv.writer(self.f)

将数据写入到CSV文件中

def parse_html(self, html):
        regex = '<td valign="top">.*?title="(.*?)".*?<p class="pl">(.*?)</p>.*?<span class="rating_nums">(.*?)</span>.*?<span class="pl">(.*?)</span>.*?<span class="inq">(.*?)</span>'
        book_list = re.findall(regex, html, re.S)
        for book in book_list:
            item = {}
            item["book_name"] = book[0]
            item["book_info"] = book[1]
            item["book_score"] = book[2]
            item["book_number"] = book[3][1:-1].strip()
            item["book_desc"] = book[4]
            print(item)
            li = [
                item["book_name"],
                item["book_info"],
                item["book_score"],
                item["book_number"],
                item["book_desc"],
            ]
            # 写入到CSV文件之中
            self.write.writerow(li)

最后关闭CSV文件

def crawl(self):
        for page in range(1, 11):
            page_url = self.url.format((page - 1) * 25)
            print('12')
            html = self.get_html(page_url)
            print('23')
            self.parse_html(html)
            print('45')
            # 控制抓取频率
            time.sleep(random.randint(1, 2))
       #关闭CSV文件
        self.f.close()

四、小结

mysql、redis和mongo数据库都可以用来存储数据,mysql和mongo数据库是基于磁盘存储,redis是基于内存的存储。mongo数据库和myspl相比它是非关系型数据库,数据类型很单一,值就是JSON文档。操作当面,mongo更加的方便快捷。
在数据分析过程中,编码方式是很重要的。我们一般在解析url中默认编码都是utf-8,但是有时候也有gb2312。所以按照我们之前的解析方式

html = requests.get(url=url,headers =self.headers).text
# .text默认编码方式是utf-8,当我们抓取的内容中有中文字符的时候,会出现乱码

解决方案

html = requests.get(url=url,headers =self.headers).content.decode("gb2312","ignore")
# "gb2312"这个是编码方式,ignore属性是因为我们在选择个别的编码方式可能并能完全兼容,一些小问题可以适当的忽略掉。

五、明天课程安排

上述的案例都是抓取一层的数据,明天学习更深层次的数据抓取。然后在按照上面的存储方法,存储自己抓取的数据。

  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2021-12-28 22:52:51  更:2021-12-28 22:53:04 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/16 3:29:48-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码