python爬虫存入数据库的一次小实践

Python爬虫新手学习

          • 第一次写博客,希望记录自己的所学所感
  • 爬虫内容
    • 工具
    • 过程
        • 1、首先确定爬虫的目标URL
          • URL处理
    • 2、user-agent伪装浏览器
    • 3、requests+soup爬虫
        • soup处理HTML+正则表达式匹配需要的数据
          • 注意
    • 4、数据库创建和插入
    • 5、整体源代码
    • 6、结果展示
        • 完结。

第一次写博客,希望记录自己的所学所感

爬虫内容

本次爬虫目标将聚美优品上口红的商品信息存入数据库,由于技术不太熟练,没有使用框架(不会)

工具

PyCharm、Navicat Premium、以及一颗赤诚的心
requests、BeautifulSoup、正则表达式

过程

1、首先确定爬虫的目标URL

url = 'http://search.jumei.com/?filter=0-11-1&search=%E5%8F%A3%E7%BA%A2&bid=4&site=bj'
URL处理

根据目标网址的每一页的网址找出规律,
第一页filter=0-11-1
第二页filter=0-11-2
第三页filter=0-11-3
显而易见,发现只有“filter=0-11-1“的最后一个数字发生改变

for j in range(1, 39):
    url = 'http://search.jumei.com/?filter=0-11-' + str(j) + '&search=%E5%8F%A3%E7%BA%A2&bid=4&site=bj'

2、user-agent伪装浏览器

给代码加一个 User-Agent头 ,不同的浏览器在发送请求的时候有不同的User-Agent头
可查询user-agent大全选一个即可

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36'}

3、requests+soup爬虫

#请求浏览器获得回应
res = requests.get(url, headers=headers)
print(res.status_code)
#初始化soup对象,指定Beautiful的解析器为“html.parser”
soup = BeautifulSoup(res.text, 'html.parser')

soup处理HTML+正则表达式匹配需要的数据

本次爬虫目标是口红的商品id+链接+营销方式+名字+价格+销量 写的正则表达式较长,但不唯一
正则表达式写的时候主要靠浏览器查看页面源码和审查元素,审查元素可以很清楚的看出页面标签结构,但是一般源代码和审查元素看到的代码会有部分区别 如果只看审查元素的代码可能匹配失败,我之前有惨痛的经历。。
所以一定要擦亮眼睛,在源代码里找到自己需要的内容呀。。。。

注意

1、无法判断空格有几个的地方也要匹配,不要想当然的以为只有一个空格;
2、(.*?)里匹配的是我们需要的字符串;
3、re.S 是表示在全文内匹配,不加这个只会在单行匹配;
4、Beautiful的解析器为“html.parser”还有BeautifulSoup(markup,“lxml”)BeautifulSoup(markup, “lxml-xml”) BeautifulSoup(markup,“xml”)等等很多种

#获得HTML中标签div属性为“products_wrap”de 所有内容
data = soup.find_all('div', attrs={'class': 'products_wrap'})
data = str(data)
#正则表达式匹配 商品id+链接+营销方式+名字+价格+销量
pertern = re.compile(
    r'<li.*?class=".*?".*?pid="(.*?)".*?<strong style="color: #ec2b8c">(.*?)</strong>\
.*?<a.*?href="(.*?)".*?<div class="s_l_name">.*?<a href=".*?".*?target="_blank">(.*?)</a>.*?<div.*?class="s_l_view_bg".*?<span>(.*?)</span>.*?<div.*?class="search_pl">(.*?)</div>',
    re.S)
#匹配数据 
item = re.findall(pertern, data)
#item是列表,item的每一项是一个元组,元组不能改变,所以采用了转换成list的方法进行replace方法来处理数据
    for i in item:
        i = list(i)
        for j in range(len(i)):
            i[j] = i[j].replace(' ', '')
            if j==1:
                i[j] = i[j].replace('【', '').replace('】', '')
            if j==3:
                i[j] = i[j].replace('', '').replace('', '').replace('', '')
            if j==5:
                #i[j] = i[j].replace(r'[^0-9]', '')
                i[j] = i[j].replace('人已购买|', '').replace('月销', '')
        i = tuple(i)
        print(i)

4、数据库创建和插入

需要自己先建好数据库,用户名、密码、数据库名记得自己改
每一次执行完SQL语句都要关闭数据库db.close()

def create():
    db = pymysql.connect("localhost", "用户名", "密码", "数据库名字")  # 连接数据库
    cursor = db.cursor()
    cursor.execute("DROP TABLE IF EXISTS jumeiLipstick")
    sql = """CREATE TABLE jumeiLipstick (
            ID INT PRIMARY KEY AUTO_INCREMENT,
            pid  int,
            marketing CHAR(20),
            link CHAR(255),
            name CHAR(255),
            price CHAR(20),
            sales CHAR(20)
            )"""

    cursor.execute(sql)
    db.close()

def insert(value):
    db = pymysql.connect("localhost", "用户名", "密码", "数据库名")

    cursor = db.cursor()
    sql = "INSERT INTO jumeiLipstick(pid, marketing, link, name, price,sales) VALUES ( %s, %s, %s, %s, %s, %s)"
    try:
        cursor.execute(sql, value)
        db.commit()
        print('插入数据成功')
    except:
        db.rollback()
        print("插入数据失败")
    db.close()

5、整体源代码

import requests
from bs4 import BeautifulSoup
import re
import pymysql

def create():
    db = pymysql.connect("localhost", "root", "123456", "testdb")  # 连接数据库
    cursor = db.cursor()
    cursor.execute("DROP TABLE IF EXISTS jumeiaaa")
    sql = """CREATE TABLE jumeiaaa (
            ID INT PRIMARY KEY AUTO_INCREMENT,
            pid  int,
            marketing CHAR(20),
            link CHAR(255),
            name CHAR(255),
            price CHAR(20),
            sales CHAR(20)
            )"""
    cursor.execute(sql)
    db.close()

def insert(value):
    db = pymysql.connect("localhost", "root", "123456", "testdb")
    cursor = db.cursor()
    sql = "INSERT INTO jumeiaaa(pid, marketing, link, name, price,sales) VALUES ( %s, %s, %s, %s, %s, %s)"
    try:
        cursor.execute(sql, value)
        db.commit()
        print('插入数据成功')
    except:
        db.rollback()
        print("插入数据失败")
    db.close()
create()  # 创建表

# re匹配需要的数据
pertern = re.compile(
    r'<li.*?class=".*?".*?pid="(.*?)".*?<strong style="color: #ec2b8c">(.*?)</strong>\
.*?<a.*?href="(.*?)".*?<div class="s_l_name">.*?<a href=".*?".*?target="_blank">(.*?)</a>.*?<div.*?class="s_l_view_bg".*?<span>(.*?)</span>.*?<div.*?class="search_pl">(.*?)</div>',
    re.S)
# 添加请求头   修改user-agent来伪装浏览器
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36'}
for j in range(1, 39):
    url = 'http://search.jumei.com/?filter=0-11-' + str(j) + '&search=%E5%8F%A3%E7%BA%A2&bid=4&site=bj'
    res = requests.get(url, headers=headers)
    print(res.status_code)
    soup = BeautifulSoup(res.text, 'html.parser')
    data = soup.find_all('div', attrs={'class': 'products_wrap'})
    data = str(data)
    item = re.findall(pertern, data)
    for i in item:
        i = list(i)
        for j in range(len(i)):
            i[j] = i[j].replace(' ', '')
            if j==1:
                i[j] = i[j].replace('【', '').replace('】', '')
            if j==3:
                i[j] = i[j].replace('', '').replace('', '').replace('', '')
            if j==5:
                #i[j] = i[j].replace(r'[^0-9]', '')
                i[j] = i[j].replace('人已购买|', '').replace('月销', '')
        i = tuple(i)
        print(i)
        insert(i)

6、结果展示

一共爬取了1000条数据
python爬虫存入数据库的一次小实践_第1张图片
当然在这个时代,1000条数据根本算不了什么,海量的数据才可以更好的进行数据分析说明问题
但是爬虫大同小异,完全可以修改网址、数据库设计以及必要的正则表达式就可以爬取别的内容
亲测有效。。。

完结。

之后可能会做有关数据分析以及可视化的学习

你可能感兴趣的:(python爬虫存入数据库的一次小实践)