爱倒腾的吴先森哎 2021-09-26 21:34 采纳率: 0%
浏览 308

python爬虫时爬取了1000条数据,存入sqlite数据库中只能存500条,数据表中只显示了500条!我分两次各存500条,第一次操作OK,第二次怎么都不行,这是为啥?

python爬虫时爬取了1000条数据,存入sqlite数据库中只能存500条,数据表中只显示了500条!我分两次各存500条,第一次操作OK,第二次怎么都不行,还有我试了一下将后面500条存入新建的表中,爬取内容没问题!但是存入数据库存不进去!这是啥情况?有人知道吗?怎么解决?

爬取51job网站的数据

1.获取网页

2.提取数据(标签定位+正则解析)

3.保存数据到sqlite数据库


#以下是代码

import json
import re
import sqlite3
import urllib.error  # 导入urllib库的请求、错误提示、解析模块
import urllib.request
from urllib import parse

# 全局变量
# 对于英文关键字来说,使用parse模块进行一次/二次编码都没啥变化!主要针对中文关键字!
# 51job的中文关键字需要二次编码!

# keyword="ui"
keyword = "大数据"
# keyword=input("请输入关键字:")
b1 = parse.quote(keyword)  # 先进行一次编码
b2 = parse.quote(b1)  # 进行二次编码


def main():
    print("------开始爬取网页------")
    # 1.获取网页+提取/解析数据
    # url后面的参数不要加!for循环来添上!
    baseUrl = "https://search.51job.com/list/070200,000000,0000,00,9,99," + b2 + ",2,"

    data_list = getData(baseUrl)  # 提取要爬取网页的所有数据
    print(data_list)
    # print(len(data_list))

    # 2.保存数据
    dbPath = r"51job.db"
    saveDB(data_list, dbPath)


# 获取网页+解析/提取数据
# 爬取网页并一个个的解析数据

# [注意]:有些网站不要一直去爬取访问网页,否则时间次数多了会封禁IP导致无法爬取该网址。所以爬完需要的网页后可以保存在一个html文件中,记得注释掉爬取网页代码!
# 然后再解析需要的数据
def getData(baseUrl):
    # 爬取1000条数据,分20页,每页50条数据

    datalist = []  # 保存爬取的所有数据
    for i in range(11, 21):
        # 分析要爬取的网址规律,拼接出网址方便循环爬取多个网页
        askUrl = baseUrl + str(i) + ".html?lang=c&postchannel=0000&workyear=99&cotype=99&degreefrom=99&jobterm=99&companysize=99&ord_field=0&dibiaoid=0&line=&welfare="
        # print(askUrl)

        # 爬取网页/异步请求url的内容
        html = getHtml(askUrl)  # 得到html网页内容
        # print(html)

        str_data = str(html)    # 变成字符串格式

        # 正则表达式解析出数据  (正则表达式一定要写好!不然无法筛选出需要的数据!)
        findData = re.findall(r'"engine_jds":(.*),"jobid_count"', str_data)[0]  # 得到的是一个字符串数据
        findData = findData.replace("\\", "")  # 替换掉多余字符
        # print(findData)

        # 要想提取出json格式数据中的每一项我们所需的数据,就必须将字符串用json的loads()方法转换成json格式(即字符串转成字典形式)方便提取数据!
        json_data = json.loads(findData)  # 是一个列表,每一项都是字典,字典里保存着每一个工作岗位的相关数据
        # print(json_data)

        for item in json_data:
            data = []  # 保存一个工作的相关信息
            # print(item)
            # print(item["job_href"],item["job_name"])
            data.append(item["job_href"])
            data.append(item["job_name"])
            data.append(item["company_href"])
            data.append(item["company_name"])
            data.append(item["providesalary_text"])

            # 从attribute_text属性的属性值中提取出各个数据
            info = item["attribute_text"]  # 是个列表
            # print(len(info))
            data.append(info[1])  # 将经验信息追加到data中
            if len(info)==4:    # 有些公司可能没有学历信息,所以要分情况判断!否则会报错list列表下标超出范围!
                data.append(info[2])  # 将学历信息追加到data中
            else:
                data.append("")

            if len(info)==4:    # 有些公司可能没有招聘人数信息,所以要分情况判断!否则会报错list列表下标超出范围!
                data.append(info[3])  # 将招聘人数信息追加到data中
            else:
                data.append("")

            data.append(item["workarea_text"])
            data.append(item["updatedate"])
            data.append(item["companytype_text"])
            data.append(item["jobwelf"])
            data.append(item["companysize_text"])
            data.append(item["companyind_text"])

            # print(data)
            datalist.append(data)

    # print(datalist)

    return datalist




# 获取指定url地址的网页内容(爬取一个网页)
def getHtml(askUrl):
    headers = {  # 模拟浏览器向51job服务器发送请求
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0;Win64; x64) AppleWebKit/537.36 (KHTML,like Gecko) Chrome/92.0.4515.131 Safari/537.36"
    }

    # 因为是post请求,所以必须要封装一个request对象(并携带参数)
    req = urllib.request.Request(headers=headers, url=askUrl)
    try:
        response = urllib.request.urlopen(req)  # 向服务器发送请求并获取响应
        html = response.read().decode("gbk")  # 对读取的内容进行格式编码(防止遇到中文出现乱码情况!)
    except urllib.error.URLError as e:  # 判断对象e是否存在code属性和reason属性,若有则输出!
        if hasattr(e, "code"):
            print(e.code)
        if hasattr(e, "reason"):
            print(e.reason)

    return html


# 初试化数据库(创建数据库and建表) 表名和数据库名不能相同!
def init_db(dbPath):
    con = sqlite3.connect(dbPath)  # 打开或创建数据库(建立连接)
    cur = con.cursor()  # 创建游标

    # 用游标执行建表sql语句
    cur.execute("""
    create table jobInfo(
    id integer primary key autoincrement, /* autoincrement:自增长  只有integer类型才能用!*/
    job_href  text,
    job_name  varchar,
    company_href text,
    company_name varchar,
    providesalary_text text,
    experience_info text,
    degree varchar,
    employee_num  text,
    workarea_text text,
    updatedate text,
    companytype_text text,
    jobwelf text,
    companysize_text text,
    companyind_text text
    );    
    """)

    con.commit()  # 提交数据库操作(事务提交,让此操作生效!)
    cur.close()  # 关闭游标
    con.close()  # 关闭连接


# 保存数据到sqlite数据库中
def saveDB(data_list, dbPath):
    # init_db(dbPath)  # 初始化数据库(建数据库+建表)

    con = sqlite3.connect(dbPath)  # 打开或创建数据库(建立连接)
    cur = con.cursor()  # 创建游标

    # 用游标进行插入操作
    # join()方法只能用于每一项都是字符串的列表!!!
    for row in data_list: # 有多少行数据,就执行多少次输入语句
        for index in range(len(row)):   # 给每列元素添加一对双引号!
            row[index]='"'+row[index]+'"'

        sql = """
            insert into jobInfo(job_href,job_name,company_href,company_name,providesalary_text,experience_info,degree,employee_num,workarea_text,updatedate,companytype_text,jobwelf,companysize_text,companyind_text)
            values(%s)""" % (",".join(row))
        # print(sql)

        cur.execute(sql)
        con.commit()  # 提交数据库操作(事务提交,让此操作生效!)

    cur.close()  # 关闭游标
    con.close()  # 关闭连接

    print("保存成功!")


# 测试建数据库和建表操作
# init_db(r"51job.db")


main()
print("爬取成功!请查看.db文件!")

以上代码是爬取51job搜搜大关键字数据的第11页-20页的数据!

img

这里显示的500条是第一次操作存入表中数据,第二次的存入数据库操作怎么都搞不来!

  • 写回答

2条回答 默认 最新

  • Gluttony-- 2021-09-26 22:24
    关注

    那个不是还有下一页?
    是不是另外500条在下一页!!!!

    img

    评论

报告相同问题?

问题事件

  • 创建了问题 9月26日

悬赏问题

  • ¥40 复杂的限制性的商函数处理
  • ¥15 程序不包含适用于入口点的静态Main方法
  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码