看了一眼,上次更新距今2个月,看起来我好咕咕啊(感叹),可是感觉这两个月也没闲着捏(比赛,cf,期末等等,幸亏期末考延期了,我这被期末作业都整死了快),只是懒得更博客而言(逃跑),本来打算把整理完的spss小测知识点发上来,但是操作部分没整理,就爬了(而且懒得截图)
不更题解大概是因为那段时间和学弟一起刷题,回答问题当作写题解了。
and明明已经在家一个月了,ip地址还在广东哈哈哈哈,侧面证明我是老鸽子。
别问比赛,问就是翻车。
感觉接下来能更新的东西也挺多的,再说吧(准备面实习了)。
这是本学期数据挖掘的期末大作业,作业要求上写不允许全程抄网上或其他同学的代码,以防误伤到我自己,先叠一层buff,截个图证明一下自己(防止有异议,发布博客之后就不改了)
第二层buff:文章的标题没有写很得详细(如果有幸被同学刷到那跟我没关啊)
第三层buff:会省略一些细节类的东西,大家加油!(不过我觉得应该没啥人会选这个题目,因为后面两个可以直接在上次小测的代码改,比这轻松多了,话说回来要是没事干我也可以把后面两个写了23333)
回归正题,这个大作业的要求是“淘宝(https://www.taobao.com/)上搜索a,价格区间l-r,抓取前k页的商品名、商品链接、价格、付款人数、商家名、商家链接总共6项信息(输出为excel文件)。”
第一个要求,在淘宝上搜索a物品,并遍历前k页。按理来说,这种事情可以直接通过找链接的规律来进行,不过老师要求了用selenium来处理,那就用吧
不过有一个问题是:淘宝搜索需要登陆,而selenium生成的浏览器可是啥都没有滴。
我这里使用了调用本地的登陆信息来处理
selenium的精髓就在于找到元素位置,直接模拟
具体的看注释(QAQ我老想打成//,老acmer了)
option = webdriver.ChromeOptions()#实例化谷歌设置选项
option.add_argument(r"user-data-dir=C:\Users\xxx\AppData\Local\Google\Chrome\User Data")#本地的chrome登陆信息,添加保持登录的数据路径
driver = webdriver.Chrome(options=option)#初始化driver
driver.get("https://www.taobao.com/")#打开淘宝
driver.find_element(By.XPATH, '//*[@id="q"]').clear()#清除
driver.find_element(By.XPATH, '//*[@id="q"]').send_keys("a")#输入a
driver.find_element(By.XPATH, '//*[@id="J_TSearchForm"]/div[1]/button').click()#点击搜索
下一步,我们要设置价格区间
driver.find_element(By.XPATH, '//*[@id="J_relative"]/div[1]/div/div[1]/div[1]/div/ul/li[1]/input').send_keys("l")#最小价格
driver.find_element(By.XPATH, '//*[@id="J_relative"]/div[1]/div/div[1]/div[1]/div/ul/li[3]/input').send_keys("r")#最大价格
driver.find_element(By.XPATH, '//*[@id="J_relative"]/div[1]/div/div[1]/div[1]/div/ul/li[4]/button').click()#点击确认
接下来,就是要枚举每一页,因为如果翻页的话中间出bug了后面就无了,所以还是用输入页码的方式比较保险
更保险的方法应该是写个try跳过bug,但我懒,就不写了
啊,注释太详细搞得我现在没话说,想整活
插播一段小故事:这两天在写作业(不止这门),我妈疑惑的问我:你在写专业作业还是写辅修的?我:专业课作业QAQ
谁能想到一个文科生天天在写代码捏
for i in range(1,k+1):#页码
driver.find_element(By.XPATH, '//*[@id="mainsrp-pager"]/div/div/div/div[2]/input').clear()
driver.find_element(By.XPATH, '//*[@id="mainsrp-pager"]/div/div/div/div[2]/input').send_keys("{}".format(i))#输入页码
driver.find_element(By.XPATH, '//*[@id="mainsrp-pager"]/div/div/div/div[2]/span[3]').click()#点击确认
print("正在爬取第{}页".format(i))
接下来,我们已经到了我们要的页面,那么我们就该找找我们需要的这些信息的位置啦(顺带一提,我的python码风神似c++,改不了啦)
这里辨析一下find_elements和find_element这两个函数,由于我前面设置本地登陆信息的时候得更新到最新版,所以find_elements_by_xpath这种就不能用了。然后没加s的返回第一个符合条件的元素,加了s的返回所有符合条件的元素的集合
list=driver.find_elements(By.XPATH, '//*[@class="price g_price g_price-highlight"]/strong')
for j in list:
list_price.append(j.text)
#//*[@class="deal-cnt"] 人数
list=driver.find_elements(By.XPATH, '//*[@class="deal-cnt"]')
for j in list:
list_number.append(j.text)
#//*[@class="row row-2 title"] 商品名
list=driver.find_elements(By.XPATH, '//*[@class="row row-2 title"]')
for j in list:
list_goods.append(j.text)
#//*[@class="row row-2 title"] 链接
list=driver.find_elements(By.XPATH, '//*[@class="row row-2 title"]/a')
for j in list:
a = j.get_attribute('href')
list_goods_link.append(a)
#//*[@class="shop"]/a/span[2] 店名
list=driver.find_elements(By.XPATH, '//*[@class="shop"]/a/span[2]')
for j in list:
list_shop.append(j.text)
#//*[@class="shop"]/a 链接
list=driver.find_elements(By.XPATH, '//*[@class="shop"]/a')
for j in list:
a = j.get_attribute('href')
list_shop_link.append(a)
说到集合,因为每个页面的每种信息都是以集合的形式存在,我就维护了一个大的集合,每个集合是表格中的一列,最后出结果的时候直接用pandas来输出excel
list_goods=[]#商品名
list_goods_link=[]#商品链接
list_price=[]#价格
list_number=[]#付款人数
list_shop=[]#商品名
list_shop_link=[]#商家链接
data = {"商品名":list_goods,"商品链接":list_goods_link,"价格":list_price,"付款人数":list_number,"商家名":list_shop,"商家链接":list_shop_link}
df = pd.DataFrame(data)
df.to_excel('new.xlsx')
好啦,结束啦,睡觉