话不多说,进入正题,我就不说怎么安装selenium、怎么用webdriver了,有人要是不会可以私信我哈。不过我想,这里混的都是大佬,不会比我这种小白程序员差,我也就做个分享而已。
目录
一、导入需求的模块
二、初始化,设置cookie
2.1、初始化
2.2、设置cookie
三、开始爬虫
3.1、点击“查看更多”
3.2、滑动滚动条
3.3、获取数据
四、完整代码
五、总结
爬取这个网站是个意外,是一个老同学来找我帮忙,正好我对爬虫也是非常感兴趣的,就把活接了,现在分享出来。能用程序帮助他人真的是很一件很美妙的事情。
目标网址:https://index.iresearch.com.cn/app
文章图片
界面就是这样哈,我就是要爬取到这里面的所有信息,排行啦,APP名字啦,类型啦,各种数据啦,废话不说了,开始吧。
最后再声明一下:我爬取这些数据没有用来商用,如果涉嫌侵权,可以立即删除。
一、导入需求的模块
#核心模块,我就用自动化测试工具爬取了哈,大神可能看不上,不过自动化工具是方便呀。
from selenium import webdriver
#time模块主要就用一个sleep,避免程序走太快,网络跟不上,页面还加载不出来
import time
#csv模块是为了保存数据
import csv
二、初始化,设置cookie 我们先看这个网站,如果你不登录的话,其实是只能看到20个应用,这不符合我们的需求,我们要先登陆一下,然后在开发者模式(F12)找到cookie的值,并赋值给自动化浏览器。
另外,这个项目太小了,我就不用面向对象方法了,直接面向过程一步一步走下去了,代码量确实不大。如果有强迫症的可以自行改写。
2.1、初始化
driver = webdriver.Chrome()
driver.get("https://index.iresearch.com.cn/App/List")
我们先看一下 不设置cookie是怎样的,直接运行代码:
文章图片
表示现在是未登录状态
2.2、设置cookie 为了设置cookie,我们这样来,点击下面的“查看更多”,然后用手机号登陆一下,继续跳转回这个页面。再点查看更多,我们会发现,他变成了ajax动态加载,往下滚动,就自动显示出新的数据,OK,我们就是达成这个目的。
接下来按F12,如下图所示,找到我们发起的请求之后,看一下现在的cookie的值,看下面这个图
文章图片
看到了cookie的值了,把它摘取出来,复制到一边:
Hm_lvt_7c7157e9099d6a4f1b37ede1444b6c14=1561206662;
Hm_lvt_c33e4c1e69eca76a2e522c20e59773f6=1561205252,1561206293,1561206667,1561206979;
【使用自动化测试工具selenium爬虫——爬取艾瑞app获取手机app使用排行】ASP.NET_SessionId=fdikp122vg4bammo3hn5y4ga; kittyID=c6893fce74f8d889e46d0d5ea320af44;
kittyID_Index=c6893fce74f8d889e46d0d5ea320af44
为当前浏览器对象添加cookie,有专门的方法,代码如下:
from selenium import webdriver
import time
import csvdriver = webdriver.Chrome()
driver.get("https://index.iresearch.com.cn/App/List")#在这里添加cookie
driver.add_cookie({"name":"Hm_lvt_7c7157e9099d6a4f1b37ede1444b6c14", 'value':"1561206662"})
driver.add_cookie({"name":"ASP.NET_SessionId", 'value': "fdikp122vg4bammo3hn5y4ga"})
driver.add_cookie({"name":"kittyID", 'value':"c6893fce74f8d889e46d0d5ea320af44"})
driver.add_cookie({"name":"kittyID_Index", 'value':"c6893fce74f8d889e46d0d5ea320af44"})
time.sleep(5)
浏览器中获取的cookie以“=”为分界线,添加到driver中去,这个应该很好识别的,现在我们再运行一下python文件,弹出来的自动化浏览器中,你会发现,你点一下查看更多,它会显示了,说明我们已经登陆成功。
三、开始爬虫 3.1、点击“查看更多” 自动化测试工具,我们当然不可能去手帮他点“查看更多”,按F12分析“查看更多”的代码,发现他的类名是“more”,Ok,我们用direver的find_element_by_class_name获取这个对象,再调用click方法,很easy的。
然后让程序等一会,目的是让网页获取完所有的信息,网络越差,你就设置等的时间越长呗。
driver.find_element_by_class_name("more").click()
# 如果你的网络不好,就会只爬取到几个数据,这个时候增加sleep时间即可。
time.sleep(20)
可以再运行下试试,看是不是他帮你点过了,当你一直滚动滚动条,内容就会刷新。
3.2、滑动滚动条 我们想要的数据不可能只有20个,所以就要不停的滑动滚动条,我们运行js代码实现这个功能:
window.scrollTo(0, document.body.scrollHeight)的作用就是把滚动条拉到最底,我们这样循环搞个10次,当然你想要的数据越多,range里面的数字设置的越大就行了。我这里sleep两秒钟是因为我的网络比较好,你的网络差就多sleep一会。
# range里面的数字是滚轮下翻得次数,想爬取更多的数据,就填写更大的数字即可
for i in range(10):
time.sleep(2)
driver.execute_script("window.scrollTo(0, document.body.scrollHeight)")
运行下试试看,是不是帮你弄了。
3.3、获取数据 获取数据这里,我使用了xpath语句,看一下就明白了:
# sleep里面的数字,如果你网络不好爬取数据不全,加大 这个数字
time.sleep(10)
nameList = driver.find_elements_by_xpath('//td[@class="col3 ng-binding"]')
classList = driver.find_elements_by_xpath('//td[@class="col4 ng-binding"]')
numsList = driver.find_elements_by_xpath('//td[@class="col6 ng-binding"]')
increList = driver.find_elements_by_xpath('//td[@class="col7"]/span[1]')
result = zip(nameList, classList, numsList, increList)
最后的result是个元组,在这里可以回顾一下zip的用法,就是把四个列表按顺序组成新的二维元组,这里面每一个元素分别存储了每一个应用的名字、类型、使用数据、增长率。
由于数据并不多,我直接把他们全部读到内存,注意:如果数据很多,我这个方法就不适用了,必须做好处理,不然你电脑爆了:
apps = []
for i in result:
app = []
for j in i:
app.append(j.text)
apps.append(app)
print(apps)
在这里循环遍历result,把内容写入apps,大家可以运行一下看看,是不是数据都打印在终端了。
文章图片
最后用csv模块,写入信息:
with open("艾瑞app.csv", 'w', newline="", encoding="gb18030") as f:
writer = csv.writer(f)
for i in apps:
print(i)
writer.writerow(i)
driver.quit()
四、完整代码
from selenium import webdriver
import time
import csvdriver = webdriver.Chrome()
driver.get("https://index.iresearch.com.cn/App/List")
driver.add_cookie({"name":"Hm_lvt_7c7157e9099d6a4f1b37ede1444b6c14", 'value':"1561206662"})
driver.add_cookie({"name":"ASP.NET_SessionId", 'value': "fdikp122vg4bammo3hn5y4ga"})
driver.add_cookie({"name":"kittyID", 'value':"c6893fce74f8d889e46d0d5ea320af44"})
driver.add_cookie({"name":"kittyID_Index", 'value':"c6893fce74f8d889e46d0d5ea320af44"})
time.sleep(5)
driver.find_element_by_class_name("more").click()
# 如果你的网络不好,就会只爬取到几个数据,这个时候增加sleep时间即可。
time.sleep(20)
# range里面的数字是滚轮下翻得次数,想爬取更多的数据,就填写更大的数字即可
for i in range(10):
time.sleep(2)
driver.execute_script("window.scrollTo(0, document.body.scrollHeight)")
# sleep里面的数字,如果你网络不好爬取数据不全,加大 这个数字
time.sleep(10)
nameList = driver.find_elements_by_xpath('//td[@class="col3 ng-binding"]')
classList = driver.find_elements_by_xpath('//td[@class="col4 ng-binding"]')
numsList = driver.find_elements_by_xpath('//td[@class="col6 ng-binding"]')
increList = driver.find_elements_by_xpath('//td[@class="col7"]/span[1]')
result = zip(nameList, classList, numsList, increList)
apps = []
for i in result:
app = []
for j in i:
app.append(j.text)
apps.append(app)
print(apps)
with open("艾瑞app.csv", 'w', newline="", encoding="gb18030") as f:
writer = csv.writer(f)
for i in apps:
print(i)
writer.writerow(i)
driver.quit()
五、总结 爬虫很容易,只要逻辑清晰。
有什么问题大家都可以私信我交流哈,爬虫比django做网站简单多啦。