大数据实验二 爬取数据存入数据库

要求爬取200个城市的数据存入数据库,现有例程可以获取30个城市的数据,经测试可以顺利传入数据库,问题锁定提取200个城市的列表,然后导入例程运行即可。

ChatGPT驱动编程。。。。

修改之前的豆瓣爬取例程,采用js路径获取城市html语句,经过bs进行解析,最后输出爬取的数据,经过试错,建议不要使用直接使用字符串切片提取,会出一些奇奇怪怪的东西,可能是因为语句长短不一。

爬取的城市数据传入例程的方法也试了几种,第一种直接import程序,没有采用,要改的地方太多,其次存入csv,应该可行,但是但是我爬取的数据直接切片导致脏数据,后来实践证明使用json存取读入更为方便。

以下是编写的代码,city_get.py,用于获取城市列表并且存入city.json。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
import requests
from bs4 import BeautifulSoup
import json


# 请求网页
def page_request(url, ua):
response = requests.get(url=url, headers=ua)
html = response.content.decode('utf-8')
return html


# 解析网页
def page_parse(html):
citylist = []
soup = BeautifulSoup(html, 'lxml')
for i in range(1, 201):
sc = '#logo-input > div > div > div > div > a:nth-child(' + str(i) + ')'
item = soup.select(sc)
city = str(item)
soupt = BeautifulSoup(city, 'html.parser')
name = soupt.text
shid = city.split('\"')[-2]
trid = shid.split('=')[-1]
print(trid)
print('[\''+name[1:-1]+'\', \''+trid+'\'],')
citylist.append([name[1:-1], trid])
return citylist

if __name__ == "__main__":
print('**************开始获取城市**************')
ua = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4421.5 Safari/537.36'}
url = "http://192.168.232.132/"
html = page_request(url=url, ua=ua)
city_list = page_parse(html=html)
# print(city_list)
with open("city.json", "w") as file:
# 将列表对象转换为JSON字符串,并写入文件中
json.dump(city_list, file)
print('**************获取完成**************')

第二个即sipder.py源程序,稍加修改增加json文件读取,配合修改dbconnect.py即可直接导入数据库。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
import json
import random
import requests
import dbconnect
# 城市列表
citylist = [["上海", "b459596e9d3b11ec86d518dbf22ff9d5b45959c49d3b11ec86d518dbf22ff9d5"],
["北京", "b459a1299d3b11ec86d518dbf22ff9d5b459a12f9d3b11ec86d518dbf22ff9d5"],
["广州", "b459e6f69d3b11ec86d518dbf22ff9d5b459e6fc9d3b11ec86d518dbf22ff9d5"],
["深圳", "b45a32ba9d3b11ec86d518dbf22ff9d5b45a32bf9d3b11ec86d518dbf22ff9d5"],
["天津", "b45a74d69d3b11ec86d518dbf22ff9d5b45a74dc9d3b11ec86d518dbf22ff9d5"],
["杭州", "b45ab9f19d3b11ec86d518dbf22ff9d5b45ab9f79d3b11ec86d518dbf22ff9d5"],
["南京", "b45b09869d3b11ec86d518dbf22ff9d5b45b09909d3b11ec86d518dbf22ff9d5"],
["苏州", "b45b60989d3b11ec86d518dbf22ff9d5b45b609d9d3b11ec86d518dbf22ff9d5"],
["成都", "b45bc2779d3b11ec86d518dbf22ff9d5b45bc27e9d3b11ec86d518dbf22ff9d5"],
["武汉", "b45c25479d3b11ec86d518dbf22ff9d5b45c254f9d3b11ec86d518dbf22ff9d5"],
["重庆", "b45c8f159d3b11ec86d518dbf22ff9d5b45c8f1e9d3b11ec86d518dbf22ff9d5"],
["西安", "b45cd2609d3b11ec86d518dbf22ff9d5b45cd2669d3b11ec86d518dbf22ff9d5"],
["青岛", "b45d14b89d3b11ec86d518dbf22ff9d5b45d14bd9d3b11ec86d518dbf22ff9d5"],
["济南", "b45d56239d3b11ec86d518dbf22ff9d5b45d56289d3b11ec86d518dbf22ff9d5"],
["威海", "b45db0de9d3b11ec86d518dbf22ff9d5b45db0e49d3b11ec86d518dbf22ff9d5"],
["长春", "b45e04259d3b11ec86d518dbf22ff9d5b45e042b9d3b11ec86d518dbf22ff9d5"],
["大连", "b45e459c9d3b11ec86d518dbf22ff9d5b45e45a19d3b11ec86d518dbf22ff9d5"],
["佛山", "b45e89e49d3b11ec86d518dbf22ff9d5b45e89e99d3b11ec86d518dbf22ff9d5"],
["贵阳", "b45ee1b49d3b11ec86d518dbf22ff9d5b45ee1ba9d3b11ec86d518dbf22ff9d5"],
["合肥", "b45f24b39d3b11ec86d518dbf22ff9d5b45f24b99d3b11ec86d518dbf22ff9d5"],
["呼和浩特", "b45f682a9d3b11ec86d518dbf22ff9d5b45f682f9d3b11ec86d518dbf22ff9d5"],
["昆明", "b45fac4e9d3b11ec86d518dbf22ff9d5b45fac549d3b11ec86d518dbf22ff9d5"],
["兰州", "b45fef599d3b11ec86d518dbf22ff9d5b45fef5f9d3b11ec86d518dbf22ff9d5"],
["南宁", "b46048ab9d3b11ec86d518dbf22ff9d5b46048b09d3b11ec86d518dbf22ff9d5"],
["秦皇岛", "b4608a8c9d3b11ec86d518dbf22ff9d5b4608a919d3b11ec86d518dbf22ff9d5"],
["沈阳", "b460ce4a9d3b11ec86d518dbf22ff9d5b460ce509d3b11ec86d518dbf22ff9d5"],
["太原", "b461113f9d3b11ec86d518dbf22ff9d5b46111449d3b11ec86d518dbf22ff9d5"],
["唐山", "b46152c49d3b11ec86d518dbf22ff9d5b46152ca9d3b11ec86d518dbf22ff9d5"],
["无锡", "b46195ab9d3b11ec86d518dbf22ff9d5b46195b09d3b11ec86d518dbf22ff9d5"],
["扬州", "b461d8799d3b11ec86d518dbf22ff9d5b461d87e9d3b11ec86d518dbf22ff9d5"]
]
#用户代理,是一个特殊字符串头,使得服务器能够识别客户使用的操作系统及版本、浏览器及版本、浏览器渲染引擎、浏览器语言、浏览器插件等。#
USER_AGENT_LIST = [
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/22.0.1207.1 Safari/537.1",
"Mozilla/5.0 (X11; CrOS i686 2268.111.0) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.57 Safari/536.11",
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.6 (KHTML, like Gecko) Chrome/20.0.1092.0 Safari/536.6",
"Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.6 (KHTML, like Gecko) Chrome/20.0.1090.0 Safari/536.6",
"Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/19.77.34.5 Safari/537.1",
"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.9 Safari/536.5"]
#设置随机选择用户代理#
head = {
'User-Agent': '{0}'.format(random.sample(USER_AGENT_LIST, 1)[0]) # 随机获取
}
f = 0
c = 0
# 定义解析页面函数#
def cfindinfo(city,data):
global f,c
#连接mysql数据库#
dbcon = dbconnect.DBConnect()
dbcon.connectDatabase()
#解析返回的JSON数据#
for idata in json.loads(data)["shopBeans"]:
f +=1
# 商铺名称
ishopName = idata["shopName"]
# 商品编号
ishopId = idata["shopId"]
# 商铺星级
ishopPower = idata["shopPower"]
# 所在商区
imainRegionName = idata["mainRegionName"]
# 分类名称
imainCategoryName = idata["mainCategoryName"]
# 口味评分
itasteScore = idata["score1"]
# 环境评分
ienvironmentScore = idata["score2"]
# 服务评分
iserviceScore = idata["score3"]
# 人均消费
iavgPrice = idata["avgPrice"]
# 详细地址
ishopAddress = idata["address"]
# 商铺网址
ishopUrl = "http://192.168.232.132/shop/"+ishopId #此处改为本机ip地址
# 商铺图片
idefaultPic = idata["defaultPic"]
#将解析数据插入数据库#
#定义sql语句#
sql = '''insert into dazhonginfo(city, shopName, shopId, shopPower, mainRegionName, mainCategoryName, tasteScore, environmentScore, serviceScore, avgPrice, shopAddress, shopUrl, defaultPic) VALUES (%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)'''
#插入的参数#
params = (city, ishopName, ishopId, ishopPower, imainRegionName, imainCategoryName, itasteScore, ienvironmentScore, iserviceScore, iavgPrice, ishopAddress, ishopUrl, idefaultPic)
try:
dbcon.insert(sql,*params)
c +=1
print("----- 插入:", c, "条------")
except:
print("已存在不再重复插入!!")
print("总条数:", f)

# 定义爬虫函数(调用解析函数)#
def cinfoSpider(clist):
city = clist[0]
url = clist[1]
#爬虫地址#
cbase_url = " http://192.168.232.132/mylist/ajax/shoprank?rankId="+url
#get请求获取网页数据#
html = requests.get(cbase_url, headers=head)
#调用cfindFood函数解析#
cfindinfo(city=city, data=str(html.text))

if __name__ == '__main__':

with open("city.json", "r") as file:
# 从文件中读取JSON字符串,并转换为列表对象
my_list = json.load(file)
#循环执行对每个城市网页的爬虫#
for cdata in my_list:
cinfoSpider(cdata)

第三个即dbconnect.py,只需修改一下数据库连接信息即可,注意如果连接的是虚拟机数据库需要开启账户远程登录权限。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
import pymysql
# 此类操作数据库
class DBConnect():
#这个类用于连接数据库、插入数据、查询数据
def __init__(self):
self.host = '192.168.232.132'
self.port = 3306
self.user = 'root'
self.passwd = '123456'
self.db = 'testdazhong'
# 连接到具体的数据库
def connectDatabase(self):
conn = pymysql.connect(host=self.host,
port=self.port,
user=self.user,
passwd=self.passwd,
db=self.db,
charset='utf8')
return conn

# 插入数据
def insert(self, sql, *params):
conn = self.connectDatabase()
cur = conn.cursor()
cur.execute(sql, params)
conn.commit()
cur.close()
conn.close()
# 查询数据
def select(self, sql):
conn = self.connectDatabase()
cur = conn.cursor()
try:
# 执行SQL语句
cur.execute(sql)
conn.commit()
# 获取所有记录列表
results = cur.fetchall()
return results
except:
print("Error: unable to fetch data")
cur.close()
conn.close()

需要注意kettle已经更名为pdi,运行需要java环境配置,我装的java8,测试能运行。


大数据实验二 爬取数据存入数据库
https://steammilk.com/2024/03/23/2024-all/bigdata-train-2/
作者
蒸奶泡
发布于
2024年3月23日
更新于
2025年1月8日
许可协议