采集网站内容(三星GalaxyNote20Ultra5G-开源中国(1.2网页分析及关键代码))
优采云 发布时间: 2021-12-07 07:24采集网站内容(三星GalaxyNote20Ultra5G-开源中国(1.2网页分析及关键代码))
作业①:
候选人网站:
关键词:学生可以自由选择
输出信息:MYSQL的输出信息如下
mNomMarkmPricemNotemFile
000001
三星Galaxy
9199.00
三星 Galaxy Note20 Ultra 5G...
000001.jpg
000002......
1. 想法和代码
1.1 代码链接:
5/01.py·数据采集与集成-码云-开源中国()
1.2 网页分析及关键代码:
由于Selenium框架是用来模拟人工操作访问网站,先找到搜索框,通过id='key'即可找到
keyinput = self.driver.find_element_by_id("key")
然后输入我们要搜索的关键词,直接模拟键盘回车搜索,跳转到对应页面,不需要搜索搜索按钮点击按钮。
keyinput.send_keys(key)
keyinput.send_keys(Keys.ENTER)
由于页面加载需要时间,请先暂停 10 秒并等待页面加载。另外很多地方都需要sleep操作
time.sleep(10)
分析产品页面显示每个产品项目都在一个li标签下,所以首先找到li标签
然后解析每个li标签的内容,提取出标题、图片和价格。其中brand一般是标题的第一个词,所以可以用split来抽取
for li in lis:
time.sleep(1)
try:
src1 = li.find_element_by_xpath(".//div[@class='p-img']//a//img").get_attribute("src")
time.sleep(1)
except:
src1 = ""
try:
src2 = li.find_element_by_xpath(".//div[@class='p-img']//a//img").get_attribute("data-lazy-img")
time.sleep(1)
except:
src2 = ""
try:
price = li.find_element_by_xpath(".//div[@class='p-price']//i").text
time.sleep(1)
except:
price = "0"
note = li.find_element_by_xpath(".//div[@class='p-name p-name-type-2']//em").text
mark = note.split(" ")[0]
mark = mark.replace("爱心东东\n", "")
mark = mark.replace(",", "")
note = note.replace("爱心东东\n", "")
note = note.replace(",", "")
过程图像链接
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 = threading.Thread(target=self.downloadDB, args=(src1, src2, mFile))
T.setDaemon(False)
T.start()
self.threads.append(T)
else:
mFile = ""
插入数据库
sql = "insert into phones (mNo,mMark,mPrice,mNote,mFile) values (?,?,?,?,?)"
self.cursor.execute(sql, (mNo, mMark, mPrice, mNote, mFile))
1.3 个结果
2.经验
之前用Selenium框架爬取的时候,先在搜索框中找到输入,再找到搜索按钮模拟点击。通过这个问题,我发现可以直接模拟键盘,按回车键输入keyinput.send_keys(Keys.ENTER)也能达到同样的效果,真的很神奇。
这个问题在提取品牌的时候,还有一些不相关的词汇(如下图),需要进一步处理,比如进入商品详情页面爬取品牌(会很费时间)。
作业②:
候选人网站:中国慕课网:
输出信息:MYSQL数据库存储和输出格式
标题应以英文命名。例如:课程编号ID,课程名称:cCourse……,header应该由学生自己定义和设计:
IdcCoursecCollegecSchedulecCourseStatuscImgUrl
1
Python网络爬虫和信息提取
北京理工大学
学习了 3/18 课时
2021 年 5 月 18 日结束
2......
1. 想法和代码
1.1 代码链接:
5/02.py·数据采集与集成-码云-开源中国()
1.2 网页分析及关键代码:
启动驱动,发送请求
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
import pymysql
driver = webdriver.Chrome()
driver.get("https://www.icourse163.org/")
爬取个人课程信息,必须先登录,由于是输入密码或手动输入验证码,直接选择扫码登录更方便。
首先找到登录按钮
找到登录按钮并点击,然后等待扫码登录
driver.find_element(By.XPATH, "//div[@class='unlogin']").click()
time.sleep(20) # 等待扫码登录
登录成功后,定位到个人中心的按钮,模拟点击跳转
driver.find_element(By.XPATH, "//div[@class='ga-click u-navLogin-myCourse u-navLogin-center-container']/a").click()
每门课程都在一个div标签下,在div标签下可以查看我们需要爬取的所有信息
title = driver.find_elements(By.XPATH, '//div[@class="course-card-wrapper"]//div[@class="body"]//span[@class="text"]')
school = driver.find_elements(By.XPATH,'//div[@class="course-card-wrapper"]//div[@class="body"]//div[@class="school"]/a')
learn = driver.find_elements(By.XPATH, '//div[@class="course-card-wrapper"]//div[@class="body"]//div['
'@class="personal-info"]//span[@class="course-progress-text-span"]')
status = driver.find_elements(By.XPATH, '//div[@class="course-card-wrapper"]//div[@class="body"]//div[@class="course-status"]')
url = driver.find_elements(By.XPATH, '//div[@class="course-card-wrapper"]//div[@class="img"]/img')
最后将结果存入数据库
con = pymysql.connect(host='localhost', user='root', password='123456', charset="utf8", database='DATA_acquisition')
cursor = con.cursor()
for i in range(len(title)):
cursor.execute("insert into mooc values(%s,%s,%s,%s,%s)", (title[i].text, school[i].text, learn[i].text, status[i].text, url[i].get_attribute('src')))
con.commit()
从数据库中读取课程名称和图片地址进行多线程下载
cursor.execute("SELECT url,name FROM mooc")
rows = cursor.fetchall()
threads = []
for row in rows:
T = threading.Thread(target=downloadPic, args=(row[0], row[1]))
T.setDaemon(False)
T.start()
threads.append(T)
for t in threads:
t.join()
1.3 个结果
2.经验
我在登录过程中被这个问题困扰了很久。我一直在尝试让机器自动登录,尝试让Selenium框架自动识别验证码并通过人机验证。但最后还是用手动扫码登录,Selenium虽然可以模拟人类行为,但毕竟不具备人类智能。
作业③:Flume日志采集实验
实时分析开发实战:
1.步骤
2.经验
学习了如何使用Flume进行实时流式前端数据采集,方便后续的数据处理和数据可视化。它是实时流式场景数据流通工作的一部分。
通过本章实验的学习,可以部分掌握大数据在实时场景下的数据采集能力。