selenium+Xpath爬取电影中出现的问题与源码

因为要准备考研好久没更新了,因为要展示数据采集的作业(本来是打算想随便应付一下,但是因为一直不主动,结果自己的被别人说的差不多了,所以不得以推翻重来。所以说呀,做事你要主动一点),所以浅浅的更新一波:

这次是为了爬取douban的top250的电影信息,页面规则非常简单,url的规律非常好找,只需要改一个参数就行了,而且也没有加密。除此之外也没有什么反爬措施和ajax技术需要注意的。我就直接粘贴代码了,最后在指出几个遇到的问题:(所以这次更像是大炮打苍蝇一样)

 代码:

from lxml import etree
import csv,os
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from lxml import etree
import time
import sys



def windows_child(url):
    windows_child = webdriver.Chrome(service=s,chrome_options = chrome_options)  #访问子窗口(也可以直接点击,但是效果一样)
    windows_child.get(url)                 #访问第一页的网址
    text=windows_child.page_source                              #获取源码
    tree=etree.HTML(text)                                       #得到etree对象
    #排名
    position=''.join(tree.xpath('/html/body/div[3]/div[1]/div[1]/span[1]/text()'))
    #电影名
    name=''.join(tree.xpath('/html/body/div[3]/div[1]/h1/span[1]/text()'))
    #评分
    rating=''.join(tree.xpath('/html/body/div[3]/div[1]/div[3]/div[1]/div[1]/div[1]/div[2]/div/div[2]/strong/text()'))
    #简介
    brief_info=''.join(tree.xpath('/html/body/div[3]/div[1]/div[3]/div[1]/div[3]/div/span[1]//text()')).strip().replace('\r', '')       #去掉首尾和中间的空字符

    windows_child.close()   #关闭子页面,为什么不用quit方法,是因为会关掉所有相关联的窗口,而close只关闭当前窗口

    return position,name,rating,brief_info


# 解析网页
def page_parse(html):

    for i in range(1,26):
        # 获取电影链接
        href = ''.join(tree.xpath("/html/body/div[3]/div[1]/div/div[1]/ol/li[{}]/div/div[2]/div[1]/a/@href".format(i)))
        ####这里要写一个函数去点进电影链接,进行更为详细的爬取
        position,name,rating,brief_info=windows_child(href)

        text=position+'\t'+ name +'\t' + rating + '\t' + brief_info+'\t'+ href
        yield text

if __name__ == "__main__":
    print('**************开始爬取豆瓣电影**************')   

    #防止证书报错
    chrome_options = webdriver.ChromeOptions()
    # 忽略证书错误
    chrome_options.add_argument('--ignore-certificate-errors')
    # 忽略 Bluetooth: bluetooth_adapter_winrt.cc:1075 Getting Default Adapter failed. 错误
    chrome_options.add_experimental_option('excludeSwitches', ['enable-automation'])
    # 忽略 DevTools listening on ws://127.0.0.1... 提示
    chrome_options.add_experimental_option('excludeSwitches', ['enable-logging'])
    #无头浏览器(注释掉的话就不会有浏览器了)
    # options.add_argument('--headless')
    # options.add_argument('--disable-gpu')
     
    s = Service(executable_path='./chromedriver')
    window = webdriver.Chrome(service=s,chrome_options = chrome_options)                        #指定浏览器


    window.get('https://movie.douban.com/top250?start=0')       #访问第一页的网址
    filename="douban_movie.csv"                                 #最终文件的存储名
    if os.path.exists(filename):os.remove(filename)             #如果文件存在就删掉重来(调试用)

    for iter in range(0,251,25):                #访问那么多次
        # time.sleep(2)                                               #以防速度太快ajax没加载出来,但是在这里没啥用,因为不涉及ajax技术
        text=window.page_source                                     #获取源码
        tree=etree.HTML(text)                                       #得到etree对象
        html_url=window.current_url                                 #得到当前网页的url
        print(window.current_url)                                   #得到当前网页的url

        with open(filename,'a+',newline='',encoding='utf-8') as res_file:            #以追加的方式写入
            file=csv.writer(res_file)
            if iter==0: file.writerow(['排名','电影名','评分','简介','链接'])   #表头
            page_generator = page_parse(html=html_url)
            for _ in range(25):
                text=next(page_generator)
                file.writerow(text.split('\t'))
                print(text)

        next_page=window.find_element('class name','next')   #定位下一页的按钮
        next_page.click()
        
    print('**************爬取完成**************')

    # time.sleep(2)
    window.quit()   #关闭页面

遇到的问题:

1:UnicodeEncodeError: 'gbk' codec can't encode character '\u2022' in position 130: illegal multibyte sequence:

网上的原因也有很多,但是我是采用:

open(filename,'a+',newline='',encoding='utf-8')

with open(filename,'a+',newline='',encoding='utf-8') as res_file:    

来解决的,也就是写入文件时指定编码格式就行了

2:

 这个是代码写错了,定位元素的时候不只class,还有class name

3:15244:13796:0426/003507.148:ERROR:ssl_client_socket_impl.cc(992)] handshake failed; returned -1, SSL error code 1, net_error -100,等waring报错

这些报错都不会影响你的代码运行,但是就是不好看,你可以给你的webdriver加上一些证书即可,比如:

    #防止证书报错
    chrome_options = webdriver.ChromeOptions()
    # 忽略证书错误
    chrome_options.add_argument('--ignore-certificate-errors')
    # 忽略 Bluetooth: bluetooth_adapter_winrt.cc:1075 Getting Default Adapter failed. 错误
    chrome_options.add_experimental_option('excludeSwitches', ['enable-automation'])
    # 忽略 DevTools listening on ws://127.0.0.1... 提示
    chrome_options.add_experimental_option('excludeSwitches', ['enable-logging'])

4:selenium.common.exceptions.SessionNotCreatedException: Message: session not created: This version of ChromeDriver only sCurrent browser version is 112.0.5615.138 with binary path C:\Users\csl\AppData\Local\Google\Chrome\Application\chrome.exe

大概意思就是,你下载的驱动和你当前的谷歌版本不一致,只要找到对应的版本下载好就行了,一定要是和你电脑上的谷歌浏览器对应版本的才行,最新的都不行,找不到完全对应的就找最接近的就行,下面给出对应网站:CNPM Binaries Mirror,在这个上面下载即可

5:怎么只关掉其中一个web窗口,而不关掉主窗口?

这涉及.close()方法与.quit()方法的区别,前者是只关掉当前正在进行操作的窗口,后者则是关掉所有窗口,相当于直接把浏览器给关掉        

剩下的也没什么好讲的,毕竟比较简单,代码上注释也已经很详细了哈

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【资源介绍】 课程大作业基于Python爬取各省降水量数据及可视化分析源码+项目说明+超详细注释. 因为相关课程的缘故,需要在1个月内速成python,故选取了python最常用的爬虫作为实操训练 同时,还添加了可视化和GUI入门的内容使爬取的内容应用更丰富 在具体数据的选取上,我爬取的是各省份降水量实时数据 ###### *话不多说,开始实操* ### 正文 1. 爬取数据 - 使用python爬虫,爬取国天气网各省份24时整点气象数据 - 由于降水量为动态数据,以js形式进行存储,故采用selenium方法经xpath爬取数据 ps:在进行数据爬取时,最初使用的方法是漂亮汤法(beautifulsoup)法,但当输出爬取的内容(<class = split>时,却空空如也。在源代码界面Ctrl+Shift+F搜索后也无法找到降水量,后查询得知此为动态数据,无法用该方法进行爬取 - 使用循环和分类的方式爬取省份不同、网址相似的降水量数据,顺带记录数据对应的城市 - f—string: ```python url_a= f'http://www.weather.com.cn/weather1dn/101{a}0101.shtml' ``` *f-string 用大括号 {} 表示被替换字段,其直接填入替换内容* - 将城市和降水量相对应后存入字典再打印 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!有问题请及时沟通交流。 2、适用人群:计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工下载使用。 3、用途:项目具有较高的学习借鉴价值,也适用于小白学习入门进阶。当然也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 4、如果基础还行,或者热爱钻研,亦可在此项目代码基础上进行修改添加,实现其他不同功能。 欢迎下载,沟通交流,互相学习,共同进步!
1.项目代码均经过功能验证ok,确保稳定可靠运行。欢迎下载体验!下载完使用问题请私信沟通。 2.主要针对各个计算机相关专业,包括计算机科学、信息安全、数据科学与大数据技术、人工智能、通信、物联网等领域的在校学生、专业教师、企业员工。 3.项目具有丰富的拓展空间,不仅可作为入门进阶,也可直接作为毕设、课程设计、大作业、初期项目立项演示等用途。 4.当然也鼓励大家基于此进行二次开发。在使用过程,如有问题或建议,请及时沟通。 5.期待你能在项目找到乐趣和灵感,也欢迎你的分享和反馈! 【资源说明】 Python大作业爬取各省降水量及可视化源码+操作说明.zip 因为相关课程的缘故,需要在1个月内速成python,故选取了python最常用的爬虫作为实操训练 同时,还添加了可视化和GUI入门的内容使爬取的内容应用更丰富 在具体数据的选取上,我爬取的是各省份降水量实时数据 *话不多说,开始实操* ### 正文 1. 爬取数据 - 使用python爬虫,爬取国天气网各省份24时整点气象数据 - 由于降水量为动态数据,以js形式进行存储,故采用selenium方法经xpath爬取数据 ps:在进行数据爬取时,最初使用的方法是漂亮汤法(beautifulsoup)法,但当输出爬取的内容(<class = split>时,却空空如也。在源代码界面Ctrl+Shift+F搜索后也无法找到降水量,后查询得知此为动态数据,无法用该方法进行爬取 - 使用循环和分类的方式爬取省份不同、网址相似的降水量数据,顺带记录数据对应的城市 - f—string: ```python url_a= f'http://www.weather.com.cn/weather1dn/101{a}0101.shtml' ``` *f-string 用大括号 {} 表示被替换字段,其直接填入替换内容* - 将城市和降水量相对应后存入字典再打印 - 代码:详见资源

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值