Python爬虫京东商品列表

当我开发一个后台Node的时候,插入数据库多麻烦了,想到的是可以利用Python爬虫商品列表存到MySQL数据库,可以省去了插入数据库的麻烦。

遍历京东商品列表代码如下:

from urllib.request import urlopen
from bs4 import BeautifulSoup  #导入库

url = "http://search.yhd.com/c0-0-1003817/mbname-b/a-s1-v4-p1-price-d0-f0-m1-rt0-pid-mid0-color-size-k/?ref=ad.21102_47515303_1"; 
html = urlopen(url)  #请求网址
soup = BeautifulSoup(html, "lxml")  #解析网页信息

proPrice = soup.select("p.proPrice em")  #抓取价格
pdlink2 = soup.select('p.proName > a')   #抓取商品名称

for title,price in zip(pdlink2,proPrice):  
    title = title.contents[-1]     #将列表中的每一个商品信息提取出来
    price = price.contents[-1]     #将列表中的每一个商品价格提取出来
    print("[*] 商品标题:", title)   #输出商品标题
    print("[*] 商品价格:", price)   #输出商品价格

注意的是:用一个zip()函数实现一次遍历

输出商品列表:

[*] 商品标题: 
印尼进口 Danisa 皇冠 丹麦 曲奇 454g(新旧包装随机发货) 盒装

[*] 商品价格: 49.90

[*] 商品标题: 
澳大利亚 进口牛奶 德运(Devondale) 全脂牛奶 1L*10 整箱装
......

建一个列表

data = [] # 建一个列表,用于存放数据

填入列表

data.append([title,price]) ##将爬取的数据依次填入列表中
print(data) ##输出

打印出结果

[['\n印尼进口 Danisa 皇冠 丹麦 曲奇 454g(新旧包装随机发货) 盒装\n', '49.90\n']]
[['\n澳大利亚 进口牛奶 德运(Devondale) 全脂牛奶 1L*10 整箱装\n', '99.00\n']]

但是需要移除\n,可以通过正则表达式和替换方法

# 正则表达式
    dr = re.compile(r'\n|',re.S)
    # 正则的替换
    dd_title = dr.sub('', title)
    dd_price = dr.sub('', price)
    # 移除空格
    dd_s_title = dd_title.strip()
    dd_s_price = dd_price.strip()

要修改填入列表

data.append([dd_s_title,dd_s_price]) ##将爬取的数据依次填入列表中
print(data) ##输出

打印输入查看

[['印尼进口 Danisa 皇冠 丹麦 曲奇 454g(新旧包装随机发货) 盒装', '49.90']]
[['澳大利亚 进口牛奶 德运(Devondale) 全脂牛奶 1L*10 整箱装', '99.00']]

这样正常OK了

要增加mysql导入库

import mysql.connector

连接mysql数据库,要先设置好用户、密码和数据库名称

#连接mysql数据库
conn = mysql.connector.connect(user='root', password='root', database='mynode')
#使用cursor()方法获取操作游标
cur = conn.cursor()

然后抓取内容批量插入到goods表
向goods表(title,price)插入数据

sql = "INSERT INTO goods (title,price) values(%s,%s)"  # 这是一条sql插入语句

这样就包含了两条数据,通过executemany插入

cur.executemany(sql, data)  # 执行sql语句,并用executemany()函数批量插入数据库中
conn.commit()

注意的是如果没有python异常处理,可能无法存到数据库。要加上try...except.

    try:
        title = title.contents[-1]   #将列表中的每一个商品信息提取出来
        price = price.contents[-1]   #将列表中的每一个商品价格提取出来
        ...
        conn.commit()
    except Exception as e:
        print(e)
        conn.rollback()

插入OK就关闭数据库

# 释放数据连接
if cur:
    cur.close()
if conn:
    conn.close()

完整项目

# -*- coding: utf-8 -*-
#---------------------------------------
#   程序:商品爬虫
#   版本:0.0.2
#   作者:woaitianwen
#   日期:2018-2-3
#   语言:Python 3.6
#   操作:输入网址后就获取商品列表,然后存到mysql数据库
#---------------------------------------


from urllib.request import urlopen
from bs4 import BeautifulSoup
import mysql.connector

#连接mysql数据库
conn = mysql.connector.connect(user='root', password='root', database='mynode')
#使用cursor()方法获取操作游标
cur = conn.cursor()

url = "http://search.yhd.com/c0-0-1003817/mbname-b/a-s1-v4-p1-price-d0-f0-m1-rt0-pid-mid0-color-size-k/?ref=ad.21102_47515303_1";
html = urlopen(url)  #请求网址
soup = BeautifulSoup(html, "lxml")  #解析网页信息

proPrice = soup.select("p.proPrice em")  #抓取价格
pdlink2 = soup.select('p.proName > a')   #抓取商品名称

for title,price in zip(pdlink2,proPrice):
    data = [] # 建一个列表,用于存放数据
    try:
        title = title.contents[-1]     #将列表中的每一个商品信息提取出来
        price = price.contents[-1]     #将列表中的每一个商品价格提取出来
        # 正则表达式
        dr = re.compile(r'\n|',re.S)
        # 正则的替换
        dd_title = dr.sub('', title)
        dd_price = dr.sub('', price)
        # 移除空格
        dd_s_title = dd_title.strip()
        dd_s_price = dd_price.strip()

        #print("[*] 商品标题:", title)  #输出商品标题
        #print("[*] 商品价格:", price)  #输出商品价格

        data.append([dd_s_title,dd_s_price]) ##将爬取的数据依次填入列表中

        print(data)
        sql = "INSERT INTO goods (title,price) values(%s,%s)"  # 这是一条sql插入语句
        cur.executemany(sql, data)  # 执行sql语句,并用executemany()函数批量插入数据库中
        conn.commit()
    except Exception as e:
        print(e)
        conn.rollback()


# 释放数据连接
if cur:
    cur.close()
if conn:
    conn.close()

插入成功数据库效果