Selenium + Python +CSV
绪论
首先写这个文章的时候仅仅花了2个晚上(我是菜鸟所以很慢),自己之前略懂selenium,但是不是很懂csv,这次相当于练手了。
第一章 环境介绍
| 系统 | Windows10教育版 1709版本 |
| python | 3.6.3 |
| Selenium | 3.12.0 |
| bs4 | 0.0.1 |
| csv | 1.0 |
第二章 过程
这里是一份利用Selenium写成的爬取猫眼电影top100的代码,具体没有什么好讲的,以下我会提几个需要注意的地方。
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from bs4 import BeautifulSoup
import csv def get_html(url):
browser.get(url)
return browser.page_source
def content_print(pagesource):
soup = BeautifulSoup(pagesource,"html.parser")
films = soup.find_all("dd")
film_list= []
for film in films:
name =film.find("a")
haha =name["title"]
#print(haha) stars =film.find("p",class_ = "star")
#print(stars.text) date = film.find("p",class_ = "releasetime").string score_1 = film.find("i",class_ = "integer")
score_2 = film.find("i",class_ = "fraction")
score = score_1.text + score_2.text
#print(score)
film_list.append([haha,date,score])
print(film_list)
if __name__ == '__main__':
browser = webdriver.Chrome()
for i in range(0,10):
houzhui = str(10 * i) initial_url = "http://maoyan.com/board/4?offset=" + houzhui
html = get_html(initial_url)
content_print(html)
browser.close()
文件头的部分,“from selenium import webdriver
from selenium.webdriver.common.keys import Keys”这里已经引入了Selenium但是下一句又引入了里面的一些库,这里是为了在效率方面使得整个工程变得变得更加效率,实际上如果不加上下一句,是不能运行的。
整个代码的结构是先创建一个browser实例,然后遍历10个页面去获取HTML代码,然后把得到的HTML代码返回到content_print中来做进一步的分析,打印以及写入到csv中。最后关闭整个browser。这个过程必须在结构上先验证无误,然后在写具体的代码。
content_print(pagesource)这里是代码的核心部分。这里的“films = soup.find_all("dd")”dd是每个页面中每一个电影信息所在的地方,我们把他放入到“film_list= []”中,然后分别用“.find”函数以及class选择器来提取我们想要的内容,最后通过“film_list.append([haha,date,score])”放入到这个list中,这里基本及时把10页的电影信息写入到了一个list。
以上是这段代码的具体功能。
接下来我在写入csv的时候写了一段代码,这是对一个页面得到的信息进行写入的代码:
import pandas as pd infos = [['霸王别姬', '上映时间:1993-01-01(中国香港)', '9.6'], ['肖申克的救赎', '上映时间:1994-10-14(美国)', '9.5'], ['罗马假日', '上映时间:1953-09-02(美国)', '9.1'], ['这个杀手不太冷', '上映时间:1994-09-14(法国)', '9.5'], ['教父', '上映时间:1972-03-24(美国)', '9.3'], ['泰坦尼克号', '上映时间:1998-04-03', '9.5'], ['龙猫', '上映时间:1988-04-16(日本)', '9.2'], ['唐伯虎点秋香', '上映时间:1993-07-01(中国香港)', '9.2'], ['魂断蓝桥', '上映时间:1940-05-17(美国)', '9.2'], ['千与千寻', '上映时间:2001-07-20(日本)', '9.3']] list = []
for x in range(0,10):
for y in range(0,3):
#print(infos[x][y])
list.append(infos[x][y])
names = []
for name in range(0,30,3):
names.append(list[name])
#print(names) dates = []
for date in range(1,30,3):
dates.append(list[date])
#print(dates) grades = []
for grade in range(2,30,3):
grades.append(list[grade])
#print(grades) dateframe = pd.DataFrame({'Movies':names,'Dates':dates,'Scores':grades})
#输出顺序是怎样的?为什么不是按照我设置的顺序?
dateframe.to_csv('C:/Users/zhengyong/Desktop\/study/csv.csv',index=False,sep=',',encoding = "gbk")前写入的list放入infos,然后新建一个“list = []”,然后利用两个for把list里的list的信息写到一个list里,然后再分别把信息取出来,然后再利用“pd.DataFrame”写到csv中。
这里我引入了pandas进行写入操作。
先把我们之前写入的list放入infos,然后新建一个“list = []”,然后利用两个for把list里的list的信息写到一个list里,然后再分别把信息取出来,然后再利用“pd.DataFrame”写到csv中。
代码总体而言是比较傻瓜式的,最重要的问题是会在重复写入的时候覆盖之前写入的文件,所以接下来我会做一个新的页面功能(这段代码里的具体参数实在太多,我没找到可以使他不覆盖的方法)。
以下就是改进版本:
import pandas as pd
import csv infos = [['霸王别姬', '上映时间:1993-01-01(中国香港)', '9.6'], ['肖申克的救赎', '上映时间:1994-10-14(美国)', '9.5'], ['罗马假日', '上映时间:1953-09-02(美国)', '9.1'], ['这个杀手不太冷', '上映时间:1994-09-14(法国)', '9.5'], ['教父', '上映时间:1972-03-24(美国)', '9.3'], ['泰坦尼克号', '上映时间:1998-04-03', '9.5'], ['龙猫', '上映时间:1988-04-16(日本)', '9.2'], ['唐伯虎点秋香', '上映时间:1993-07-01(中国香港)', '9.2'], ['魂断蓝桥', '上映时间:1940-05-17(美国)', '9.2'], ['千与千寻', '上映时间:2001-07-20(日本)', '9.3']] list = []
for x in range(0,10):
for y in range(0,3):
#print(infos[x][y])
list.append(infos[x][y])
#print(list) names = []
for n in range(0,30,3):
for i in range(n,n+3):
#print(list[i])
names.append(list[i])
print(names) # csv 写入
#names = ['marry', 26]
# 打开文件,追加a
out = open('C:/Users/zhengyong/Desktop/study/Stu_csv.csv', 'a', newline='') # 设定写入模式
csv_write = csv.writer(out, dialect='excel')
# 写入具体内容
csv_write.writerow(names)
print( str(n/3) + "times to write in the Excel!")
names = []
其中有一段代码我得具体说说,
names = [] #新建一个names[]
for n in range(0,30,3):
for i in range(n,n+3):
#print(list[i]) #每三个一组,把30个遍历完
names.append(list[i]) 添加到names
print(names)
这段代码实际上是把一个list分成了好多个(10)新的list,名字为names,然后再去写入,再继续下一组。。。
第三章 最终成品
'''这个版本能够爬出拥有10页的电影信息的具体信息,
并将这些信息写在Excel中。整个过程是批量化的,输入参数无需干预。''' from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from bs4 import BeautifulSoup
import csv def get_html(url):
browser.get(url)
return browser.page_source
def content_print(pagesource):
soup = BeautifulSoup(pagesource,"html.parser")
films = soup.find_all("dd")
infos= []
for film in films:
name =film.find("a")
haha =name["title"]
#print(haha) stars =film.find("p",class_ = "star")
#print(stars.text) date = film.find("p",class_ = "releasetime").string score_1 = film.find("i",class_ = "integer")
score_2 = film.find("i",class_ = "fraction")
score = score_1.text + score_2.text
#print(score)
infos.append([haha,date,score])
print(infos) list = []
for x in range(0, 10):
for y in range(0, 3):
# print(infos[x][y])
list.append(infos[x][y])
# print(list) names = []
for n in range(0, 30, 3):
for i in range(n, n + 3):
# print(list[i])
names.append(list[i])
print(names) # csv 写入
#names = ['marry', 26] # 打开文件,追加a
out = open('C:/Users/zhengyong/Desktop/study/csv.csv', 'a', newline='') # 设定写入模式
csv_write = csv.writer(out, dialect='excel')
# 写入具体内容
csv_write.writerow(names)
print(str(n / 3) + "times to write in the Excel!")
names = [] if __name__ == '__main__':
browser = webdriver.Chrome()
for i in range(0,10):
houzhui = str(10 * i)
initial_url = "http://maoyan.com/board/4?offset=" + houzhui
html = get_html(initial_url)
content_print(html)
browser.close()
Selenium + Python +CSV的更多相关文章
- selenium + python自动化测试环境搭建
selenium的在python平台的搭建: 搭建平台windows 准备工具如下: --------------------------------------------------------- ...
- Page Object Model (Selenium, Python)
时间 2015-06-15 00:11:56 Qxf2 blog 原文 http://qxf2.com/blog/page-object-model-selenium-python/ 主题 Sel ...
- selenium + python 多浏览器测试
selenium + python 多浏览器测试 支持库包 在学习 Python + Selenium 正篇之前,先来看下对多浏览器模拟的支持.目前selenium包中已包含webdriver,hel ...
- selenium + python 自动化测试环境搭建
selenium + python 自动化测试 —— 环境搭建 关于 selenium Selenium 是一个用于Web应用程序测试的工具.Selenium测试直接运行在浏览器中,就像真正的用户在操 ...
- <译>Selenium Python Bindings 5 - Waits
如今,大多数的Web应用程序使用AJAX技术.当页面加载到浏览器,页面中的元素也许在不同的时间间隔内加载.这使得元素很难定位,如果在DOM中的元素没有呈现,它将抛出ElementNotVisibleE ...
- <译>Selenium Python Bindings 2 - Getting Started
Simple Usage如果你已经安装了Selenium Python,你可以通过Python这样使用: #coding=gbk ''' Created on 2014年5月6日 @author: u ...
- <译>Selenium Python Bindings 1 - Installation
Installation Introduction Selenium Python bindings 提供了一个简单的API来使用Selenium WebDriver编写使用功能/验收测试.通过Sel ...
- selenium python 第一个脚本
为什么选择python?我的回答很简单,简单易学,功能强大! 下面看看python和selenium 2的结合是什么样子吧 一.第一个selenium python脚本: #coding = utf- ...
- selenium + python自动化测试环境搭建--亲测
环境准备: 1.下载所学安装包: setuptools https://pypi.python.org/packages/2.7/s/setuptools/ selenium https://pypi ...
随机推荐
- RabbitMQ队列的使用
为什么要用RabbitMQ 以常见的订单系统为例,用户点击[下单]按钮之后的业务逻辑可能包括:扣减库存.生成相应单据.发红包.发短信通知.在业务发展初期这些逻辑可能放在一起同步执行,随着业务的发展订单 ...
- pytest 10 skip跳过测试用例
pytest.mark.skip可以标记无法在某些平台上运行的测试功能,或者你希望失败的测试功能 skip意味着只有在满足某些条件时才希望测试通过,否则pytest应该跳过运行测试.常见事例时非win ...
- jmeter循环控制器加jdbc req结果配合组合参数遍历
jdbc请求:jdbc sampler 保存结果中三个变量名 循环控制器:xhkzq 的循环次数填写:${其中一个变量名_#} 循环控制器里面:http sampler ,前置处理器,取消c ...
- LFYZ-OJ ID: 1021 邮票问题
邮票问题 Problem Description 设有已知面额的邮票m种,每种有n张,用总数不超过n张的邮票,能从面额1开始,最多连续组成多少面额.(1≤m≤100,1≤n≤100,1≤邮票面额≤25 ...
- SCI,EI,ISTP
SCI: Science Citation Index EI: The Engineering Index ISTP: Index to Scientific & Technic ...
- [物理学与PDEs]第3章第2节 磁流体力学方程组 2.3 磁流体力学方程组
1. 磁流体力学方程组 $$\beex \bea \cfrac{\p {\bf H}}{\p t} &-\rot({\bf u}\times{\bf H})=\cfrac{1}{\sigma ...
- luogu 1731 搜索剪枝好题
搜索剪枝这个东西真的是骗分利器,然鹅我这方面菜的不行,所以搜索数学dp三方面是真的应该好好训练一下 一本通的确该认真的刷嗯 #include<bits/stdc++.h> using na ...
- win10自带邮箱添加网易企业邮箱
开始-邮件-账户-添加账户-高级安装程序-internet电子邮件-然后输入网易企业邮箱的用户名和相关服务器设置就行了 接收服务器 pop.qiye.163.com发送服务器 smtp.qiye.16 ...
- C# - 表达式与语句
表达式与语句(Expression&Statement) 操作数(Operands) 1.数字.2.字符.3.变量.4.类型.5.对象.6.方法 操作符(Operator) 参考:C# - 操 ...
- MyBatis联表查询
MyBatis逆向工程主要用于单表操作,那么需要进行联表操作时,往往需要我们自己去写sql语句. 写sql语句之前,我们先修改一下实体类 Course.java: public class Cours ...