# 数据采集技术第五次作业

 mNo mMark mPrice mNote mFile 000001 三星Galaxy 9199.00 三星Galaxy Note20 Ultra 5G... 000001.jpg 000002 …… …… …… ……

1.解题过程：

1.1准备工作

def startUp(self, url, key):
chrome_options = Options()
self.driver = webdriver.Chrome(chrome_options=chrome_options)

try:
self.con = sqlite3.connect("clothes.db")
self.cursor = self.con.cursor()
try:
self.cursor.execute("drop table clothes")
except:
pass
try:
sql = "create  table  clothes(序号 varchar(32) primary key, 商品 varchar(256),价格 varchar(32),商店 varchar(256),图片 varchar(256))"
self.cursor.execute(sql)
except:
pass
except Exception as err:
print(err)

try:
if not os.path.exists(MySpider.imagePath):
os.mkdir(MySpider.imagePath)#判断路径是否存在
images = os.listdir(MySpider.imagePath)
for img in images:
s = os.path.join(MySpider.imagePath, img)
os.remove(s)
except Exception as err:
print(err)

1.2查看网站信息，编写爬取代码。

lis =self.driver.find_elements_by_xpath("//div[@id='J_goodsList']//li[@class='gl-item']")

for li in lis:
try:#爬取价格
price = li.find_element_by_xpath(".//div[@class='p-price']//i").text
except:
price = "0"
try:#爬取商店
shop = li.find_element_by_xpath(".//div[@class='p-shop']//a").text
except:
shop = ""
try:#爬取商品
name = li.find_element_by_xpath(".//div[@class='p-name p-name-type-2']//em").text
except:
name = ""
self.No = self.No + 1#记录序号
# if self.No > 139:
#     self.closeUp()#页数过多，取了前139张
no = str(self.No)
while len(no) < 6:
no = "0" + no

try:#在属性src中
src1 = li.find_element_by_xpath(".//div[@class='p-img']//a//img").get_attribute("src")
except:
src1 = ""
try:#在属性data-lazy-img中
src2 = li.find_element_by_xpath(".//div[@class='p-img']//a//img").get_attribute("data-lazy-img")
except:
src2 = ""

if src1:
src1 = urllib.request.urljoin(self.driver.current_url, src1)
p = src1.rfind(".")
mFile = no + src1[p:]
elif src2:
src2 = urllib.request.urljoin(self.driver.current_url, src2)
p = src2.rfind(".")
mFile = no + src2[p:]
if src1 or src2:
T.setDaemon(False)#下载进程
T.start()
else:
mFile = ""

nextPage = self.driver.find_element_by_xpath("//span[@class='p-num']//a[@class='pn-next']")
time.sleep(10)
nextPage.click()
self.processSpider()

1.3插入函数

    def insertDB(self, No, name, Price, shop, File):
try:
sql = "insert into clothes(序号,商品,价格,商店,图片) values (?,?,?,?,?)"
self.cursor.execute(sql, (No, name, Price, shop, File))
except Exception as err:
print(err)

1.4图片下载函数

def download(self, src1, src2, mFile):
data = None
if src1:
try:
resp = urllib.request.urlopen(req, timeout=10)
except:
pass
if not data and src2:
try:
resp = urllib.request.urlopen(req, timeout=10)
except:
pass
if data:
fobj = open(MySpider.imagePath + "\\" + mFile, "wb")#下载图片路径
fobj.write(data)
fobj.close()

1.5退出函数

    def closeUp(self):
try:
self.con.commit()
self.con.close()
self.driver.close()
except Exception as err:
print(err);

1.6输出结果：（每类股票爬取139个）

2.心得体会：

使用Selenium框架+MySQL爬取中国mooc网课程资源信息（课程号、课程名称、教学进度、课程状态，课程图片地址），同时存储图片到本地项目根目录下的imgs文件夹中，图片的名称用课程名来存储。

 Id cCourse cCollege cSchedule cCourseStatus cImgUr 1 Python网络爬虫与信息提取 北京理工大学 已学3/18课时 2021年5月18日已结束 http://eduimage.nosdn.127.net/C0AB6 FA791150F0DFC0946B9A01C8CB2.jpg 2 …… …… …… …… ……

1.解题过程：

1.1设置启动chrome可见

driver = webdriver.Chrome()

请求url

driver.get("https://www.icourse163.org/")

driver.maximize_window()

1.2登录/注册

driver.find_element_by_xpath("//a[@class='f-f0 navLoginBtn']").click()

driver.find_element_by_xpath("//div[@class='ux-login-set-scan-code_ft']//span[@class='ux-login-set-scan-code_ft_back']").click() # 选择另一种方式登录
time.sleep(1)

driver.find_elements_by_xpath("//ul[@class='ux-tabs-underline_hd']//li")[1].click()
time.sleep(1)
temp_iframe_id = driver.find_elements_by_tag_name('iframe')[1].get_attribute('id')
driver.switch_to.frame(temp_iframe_id)

driver.find_element_by_xpath("//input[@type='tel']").send_keys('15224730327')
time.sleep(2)#手机号登录
driver.find_element_by_xpath("//input[@class='j-inputtext dlemail']").send_keys('yuminihao999!')
time.sleep(2)#密码
time.sleep(2)#点击登录

driver.find_element_by_xpath("//div[@class='u-navLogin-myCourse-t']").click()
time.sleep(2)

1.3创建数据库

try:
con = sqlite3.connect("mooc.db")#连接数据库
cursor = con.cursor()
try:
cursor.execute("drop table mooc")
except:
pass
try:#创建数据库
sql = "create  table  mooc(序号 varchar(32) primary key,名称 varchar(16),课程 varchar(32),课时 varchar(12),状态 varchar(12),图片 varchar(256))"
cursor.execute(sql)
except:
pass
except Exception as err:
print(err)

1.4爬取信息

for link in driver.find_elements_by_xpath("//div[@class='course-card-wrapper']"):

name = link.find_element_by_xpath('.//span[@class="text"]').text# 课程名称
imgUrl=link.find_element_by_xpath(".//div[@class='img']/img").get_attribute("src")# 图片地址
urllib.request.urlretrieve(imgUrl, 'E:\爬取图片\\' + str(no)+'.jpg')  # 下载图片

1.5插入操作

    try:
cursor.execute("insert into mooc(序号,名称,课程,课时,状态,图片) values (?,?,?,?,?,?)",
(str(no), name, school,schedule,status,imgUrl))
except Exception as err:
print(err)

1.6关闭操作

con.commit()
con.close()
driver.close()

1.7 输出信息：

2.心得体会

driver.find_element_by_xpath("//input[@type='password']").send_keys('yuminihao999!')

通过此次实验我初步了解了华为云，它主要介绍如何使用Flume进行实时流前端数据采集，便于之后的数据处理和可视化，是实时流场景数据流通的部分工作。

posted @ 2021-11-26 19:44  R-zhang  阅读(36)  评论(0编辑  收藏  举报