首页 > 其他分享 >爬虫 - demo

爬虫 - demo

时间:2022-11-04 22:13:24浏览次数:32  
标签:re demo list 爬虫 db item data append

# -*- coding = utf-8 -*-
# @Time: 20:55
# @Author: zzc
# @File: spider.py
# @Software: PyCharm
import urllib.request
from bs4 import BeautifulSoup
import openpyxl
import re
import sqlite3

link_pattren = '<a href="(.*?)">'
src_pattren = 'src="(.*?)"'
cname_pattern = '<span class="title">(.*?)</span>'
rating_pattern = '<span class="rating_num" property="v:average">(.*?)</span>'
judge_pattern = '<span>(.*?)人评价</span>'
ing_pattern = re.compile('<span class="inq">(.*?)</span>')
content_pattern = re.compile(r'<p class="">(.*?)</p>', re.S)  # re.S 让.匹配换行



def main():
    baseurl = 'https://movie.douban.com/top250?start='
    # 1.爬取数据
    data_list = get_data(baseurl)
    # 2.保存数据 到xlsx
    # save_path = './豆瓣电影Top250.xlsx'
    # save_data(data_list, save_path)
    db_file = 'douban.db'
    save_data2db(data_list, db_file)


def init_db(db_file):
    ''' 创建保存数据的表 '''
    create_table_sql = '''
        create table douban
        (
            id integer primary key autoincrement,
            address_link text,
            img_link text,
            cname varchar,
            ename varchar,
            rate numberic,
            judge numberic,
            ing text,
            content
        )
    '''
    conn = sqlite3.connect(db_file)
    cursor = conn.cursor()
    cursor.execute(create_table_sql)

    conn.commit()
    conn.close()


def save_data2db(data_list, db_file):
    ''' 将爬取到的数据保存到数据库 '''
    init_db(db_file)   # 创建表
    # print(data_list)
    conn = sqlite3.connect(db_file)
    cursor = conn.cursor()
    # SQL方式一:
    # for rows in data_list:
    #     fmt = ''
    #     for index in range(len(rows)):
    #         if index == len(rows) -1:
    #             fmt += '"' + rows[index] + '"'
    #         else:
    #             fmt += '"' + rows[index] + '"' + ','
    #     # 2.拼装sql
    #     sql = f'insert into douban7 values(null,{fmt})'

    # SQL 方法二:
    for row in data_list:
        tup = tuple(row)

        sql = 'insert into douban values(null,?,?,?,?,?,?,?,?)'

        cursor.execute(sql,tup) # 第二个参数传列表和元组均可
        conn.commit()
    conn.close()

def ask_url(url):
    '''请求网址'''
    head = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36'
    }  # 伪装为浏览器
    request = urllib.request.Request(url, headers=head)
    html = ''
    try:
        resp = urllib.request.urlopen(request)
        html = resp.read().decode('utf-8')
    except urllib.error.URLError as e:
        if hasattr(e, 'code'):
            print(e.code)
        if hasattr(e, 'reason'):
            print(e.reason)
    return html


def get_data(baseurl):
    data_list = []
    for i in range(0, 10):
        url = baseurl + str(i * 25)
        html = ask_url(url)
        # 逐一解析数据
        soup = BeautifulSoup(html, 'html.parser')
        item_list = soup.find_all('div', class_="item")  # 获取所有class属性为item 的div
        for item in item_list:
            data = []
            # print(item)
            str_item = str(item)
            # 使用re 正则匹配值
            link = re.findall(link_pattren, str_item)  # link
            data.append(link[0])

            src = re.findall(src_pattren, str_item)
            data.append(src[0])  # 图片信息

            cname = re.findall(cname_pattern, str_item)  # 片名
            # [data.append(x.replace('\xa0/\xa0', '')) for x in cname]  # 片名
            if len(cname) == 2:
                data.append(cname[0])
                ename = cname[1].replace('\xa0/\xa0', '') # 英文名
                data.append(ename)
            else:
                # 只有一个中文名
                data.append(cname[0])
                data.append(' ')

            rating = re.findall(rating_pattern, str_item)
            data.append(rating[0])  # 评分

            judge = re.findall(judge_pattern, str_item)
            data.append(judge[0])  # 评论人数

            inq = re.findall(ing_pattern, str_item)
            if inq:
                data.append(inq[0])
            else:
                data.append(" ")

            content = re.findall(content_pattern, str_item)

            content = re.sub(r'<br/>', '', content[0])
            content = content.strip()  # 去掉空格
            data.append(content)
            data_list.append(data)

    return data_list


def save_data2(data_list, save_path):
    ''' 将数据存储到xlsx '''
    wb = openpyxl.Workbook()
    ws = wb.active
    ws.title = '豆瓣电影Top250'
    first_row = ('地址', '图片', '中文名称', '外文名称', '评分', '评论人数', '简介', '内容')
    # ws.append(first_row)
    for i in range(1, 9):
        ws.cell(row=1, column=i).value = first_row[i - 1]

    # 循环
    for row in range(0, 249):
        data = data_list[row]
        for col in range(0, 8):
            ws.cell(row=row + 2, column=col + 1).value = data[col]

    wb.save(save_path)


if __name__ == '__main__':
    main()
    # init_db('demo.db')

成功将抓取到的数据存入database:

标签:re,demo,list,爬虫,db,item,data,append
From: https://www.cnblogs.com/czzz/p/16859258.html

相关文章

  • 12.认识爬虫
    爬虫概念概念网络爬虫也叫网络蜘蛛,特指一类自动批量下载网络资源的程序,这是一个比较口语化的定义。更加专业和全面对的定义是:网络爬虫是伪装成客户端与服务端进行数据......
  • 为什么说高匿的HTTP代理是爬虫过程中必须的
    不少人在选择代理套餐的时候,追求低成本,选择的HTTP代理套餐也是五花八门,但唯一的要求就是要便宜,能有多便宜就要有多便宜,以致于直接选择一般的透明代理也在所不惜。透明......
  • Demo57_多态的另一种表现形式
    输出类的代码如下dogLbLd=newdog();//创造一个子类的对象LbLd.name="拉布拉多";//给子类的对象赋值System.out.println("=======");......
  • Python3爬虫豆瓣电影TOP250将电影名写入到EXCEL
    大家好,我是你们的老朋友泽哥,最近在学习Python3.6,于是兴起写了个小小的爬虫今天我们要爬取得页面是豆瓣电影TOP250,连接如下:​​http://movie.douban.com/top250?start=0&filt......
  • dea运行支付宝网站支付demo踩坑解决及其测试注意事项
    一、前言在一些商城网上中,必不可少的是支付,支付宝和微信比较常见,最近小编也是在研究这一块,看看支付宝怎么进行支付的,支付宝给我们提供了demo和沙箱测试。减少我们的申请的......
  • 爬虫注意事项
    提到爬虫大家可能都不陌生,简单来说,爬虫就是用代码来请求互联网资源,至于怎么处理获取到的互联网资源,其实已经不在爬虫的知识范围之内了。我是一个做java开发的,所以自然也有用......
  • Demo56_关于多态_较复杂
    输出类的代码如下packagecom.oop.DuoTai_5;publicclassApplication{publicstaticvoidmain(String[]args){//方法的输出与右侧关系不大,左侧......
  • vue demo 1102
    <scriptlang="ts">import{ref,defineComponent}from'vue'exportdefaultdefineComponent({setup(){constfields=['name','address','email'......
  • 【Android】Android开发点击查看手机电量的小功能。学习广播的一个小技能小Demo
    作者:程序员小冰,GitHub主页:​​https://github.com/QQ986945193​​​微博:​​​http://weibo.com/mcxiaobing​​首先给大家看一下效果图:先写一个广播类:packagedavid.q......
  • 【Android】时间选择器,选择日期DatePicker 简单详解demo及教程
    作者:程序员小冰,GitHub主页:​​https://github.com/QQ986945193​​新浪微博:​​http://weibo.com/mcxiaobing​​首先给大家看一下我们今天这个最终实现的效果图:这个......