采集网站内容(三星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进行实时流式前端数据采集,方便后续的数据处理和数据可视化。它是实时流式场景数据流通工作的一部分。

  通过本章实验的学习,可以部分掌握大数据在实时场景下的数据采集能力。

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线