本次爬虫目标将聚美优品上口红的商品信息存入数据库,由于技术不太熟练,没有使用框架(不会)
PyCharm、Navicat Premium、以及一颗赤诚的心
requests、BeautifulSoup、正则表达式
url = 'http://search.jumei.com/?filter=0-11-1&search=%E5%8F%A3%E7%BA%A2&bid=4&site=bj'
根据目标网址的每一页的网址找出规律,
第一页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'
给代码加一个 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'}
#请求浏览器获得回应
res = requests.get(url, headers=headers)
print(res.status_code)
#初始化soup对象,指定Beautiful的解析器为“html.parser”
soup = BeautifulSoup(res.text, 'html.parser')
本次爬虫目标是口红的商品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)
需要自己先建好数据库,用户名、密码、数据库名记得自己改
每一次执行完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()
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)
一共爬取了1000条数据
当然在这个时代,1000条数据根本算不了什么,海量的数据才可以更好的进行数据分析说明问题
但是爬虫大同小异,完全可以修改网址、数据库设计以及必要的正则表达式就可以爬取别的内容
亲测有效。。。
之后可能会做有关数据分析以及可视化的学习