Selenium爬取电影网页写成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中。
前写入的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() 









转载于:https://www.cnblogs.com/two-peanuts/p/Selenium.html

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值