• 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的代码,具体没有什么好讲的,以下我会提几个需要注意的地方。

     1 from selenium import webdriver
     2 from selenium.webdriver.common.keys import Keys
     3 from bs4 import BeautifulSoup
     4 import csv
     5 
     6 def get_html(url):
     7     browser.get(url)
     8     return browser.page_source
     9 def content_print(pagesource):
    10     soup = BeautifulSoup(pagesource,"html.parser")
    11     films = soup.find_all("dd")
    12     film_list= []
    13     for film in films:
    14         name =film.find("a")
    15         haha =name["title"]
    16         #print(haha)
    17 
    18         stars =film.find("p",class_ = "star")
    19         #print(stars.text)
    20 
    21         date = film.find("p",class_ = "releasetime").string
    22 
    23         score_1 = film.find("i",class_ = "integer")
    24         score_2 = film.find("i",class_ = "fraction")
    25         score = score_1.text + score_2.text
    26         #print(score)
    27         film_list.append([haha,date,score])
    28     print(film_list)
    29 if __name__ == '__main__':
    30     browser = webdriver.Chrome()
    31     for i in range(0,10):
    32         houzhui = str(10 * i)
    33 
    34         initial_url = "http://maoyan.com/board/4?offset="  + houzhui
    35         html = get_html(initial_url)
    36         content_print(html)
    37     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()









  • 相关阅读:
    半导体质量管理_Stargate
    半导体质量管理_eCAP LineWorks SPACE eCAP(电子OCAP)
    半导体质量管理_SQM 供应商质量管理
    半导体质量管理(LineWorks)_SPACE(统计过程分析和控制环境)
    计算机架构(层的由来)
    三层网络结构(客户端,应用服务层,数据源层)
    Navigator对象
    为什么大型互联网都需要网关服务?
    igate(因特网网关)
    [分享] SDK 2018.3烧写没有DDR的单板的Flash
  • 原文地址:https://www.cnblogs.com/two-peanuts/p/9066143.html
Copyright © 2020-2023  润新知