python 使用selenium等爬虫技术爬取某华网

这篇具有很好参考价值的文章主要介绍了python 使用selenium等爬虫技术爬取某华网。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

本程序可以根据时间要求获取某华网上不同模块的新闻内容,时间要求包括设置截止日期,以及时间间隔,比如说获取距离2023-04-20一天以内的新闻。主要使用了selenium有关的爬虫技术,具体实现如下:

目录

目录

一、SpiderXinhua类的基础属性

二、日期获取与格式转换的函数timeinhref

三、 得到可用的网页链接need_hrefget

四、单模块新闻获取xinhua_onemokuai_urlsget

五、循环每个模块xinhuawangurlsget

六、其余函数

七、执行示例

一、SpiderXinhua类的基础属性

程序被封装为一个类SpiderXinhua,此类中相关属性如下:

xinhua_url_base0 = "http://www.news.cn"
    #各个模块的链接
    xinhua_url_lists = {
       
    }
    #代理信息
    user_agent = "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36"
    headers = {
        "user-agent": user_agent
    }
    #错误提示信息
    Xinhua_errormessage = []
    #可用的url
    Need_url = []
    # 当天日期
    # 查看更多
    LookmoreBtn = "//div[contains(@class,'xpage-more-btn')]"
    #xpath信息
    # 军事
    Xpath_army = "//ul[contains(@class,'army_list')]//div[@class='tit']/a/@href"
    Xpath_army_spide = "//div[@class='swiper-wrapper']/div[not(contains(@class,'swiper-slide-duplicate'))]//p[@class='name']/a/@href"
    # 列表
    Xpath_t_start = "//div[@class='item item-style1']["
    Xpath_t_end = "]/div[@class='txt']/div[@class='info clearfix domPc']/div[contains(@class,'time')]/text()"
    Xpath_h_start = Xpath_t_start
    Xpath_h_end = "]//div[@class='tit']//a/@href"
    # 教育
    Xpath_Jt_start = "//div["
    Xpath_Jt_end = "]/div/div[@class='item item-style1']/div[@class='txt']/div[@class='info clearfix domPc']/div[@class='time']/text()"
    Xpath_Jh_start = Xpath_Jt_start
    Xpath_Jh_end = "]/div/div[@class='item item-style1']/div[@class='txt']/div[@class='tit']/a/@href"
    # 特殊列表
    Xpath_Ft_start = "//li[@class='item item-style2']["
    Xpath_Ft_end = "]/div[@class='info clearfix domPc']/div[@class='time']/text()"
    Xpath_Fh_start = Xpath_Ft_start
    Xpath_Fh_end = "]/div[@class='tit']//a/@href"
    # 轮播
    Xpath_info_spide = "//div[contains(@class,'swiper-slide')]/div[@class='tit']//a/@href"
    Xpath_spidenum = "//span[@class='swiper-pagination-total']/text()"
    # 体育
    Xpath_sports = "//div[@class='mcon']//a/@href"
    #selenium
    option = webdriver.ChromeOptions()
    option.add_argument("headless")
    path = 'chromedriver.exe'
    browswe = webdriver.Chrome(executable_path=path, chrome_options=option)

当然,代码中的xpath的信息是根据对相关模块的具体信息得到的,也可以根据新的页面信息自行构造出xpath。

二、日期获取与格式转换的函数timeinhref

通过对新华网上网页链接的观察,可以发现这些url可以以/c.html或者/c.htm结尾,或者是以/c_10个数字.htm的形式结尾,不同的格式中,其日期信息位置不同,因为我们需要提取存在于链接中的日期信息,因此需要对不同样式的url进行不同的处理,具体如下所示:

'''日期获取与格式转换'''
    def timeinhref(self,news_href):
        new_date_date = datetime.datetime(1900, 1, 1).date()
        #news_href存在才执行下面的程序,减少了程序出bug的情况
        if news_href:
            #判断程序是以/c.html结尾还是以/c.htm结尾或者是其他形式
            if str(news_href).endswith("/c.html") or str(news_href).endswith("/c.htm"):
                get_date = str(news_href).split("/")[-3]
                new_date_date = datetime.datetime(int(get_date[0:4]), int(get_date[4:6]), int(get_date[6:])).date()
            else:
                if re.search('^c_[0-9]{10}.htm$', str(news_href).split("/")[-1]) or re.search('^c_[0-9]{10}.html$', str(news_href).split("/")[-1]):
                    smalllist = str(news_href).split("/")
                    get_ym = smalllist[-3]
                    get_d = smalllist[-2]
                    new_date_date = datetime.datetime(int(get_ym[0:4]), int(get_ym[5:]), int(get_d[0:])).date()
        return new_date_date

三、 得到可用的网页链接need_hrefget

我们最终需要的只是符合时间要求的新闻,因此仅保留符合要求的新闻的链接。根据xpath从页面上获取的url信息可能是不能直接访问的,因为它们不是以http://开头的,要加上"http://www.news.cn"方可访问

    def need_hrefget(self,need_url, army_href):
        if army_href:
            for onehref in army_href:
                if str(onehref).endswith(".htm") or str(onehref).endswith(".html"):
                    new_date_date = SpiderXinhua.timeinhref(self,onehref)
                    now_date = self.Now_date
                    daysub = (now_date - new_date_date).days + 1
                    #仅获得符合时间要求的新闻
                    if int(daysub) <= int(self.datesub):
                        #对不是以http://开头的url要加上"http://www.news.cn"方可访问
                        if str(onehref)[0:1] == "/":
                            onehref = SpiderXinhua.xinhua_url_base0 + str(onehref)
                        need_url.append(onehref)
                        print(onehref)
                    else:
                        break
                else:
                    continue

四、单模块新闻获取xinhua_onemokuai_urlsget

对于一些模块,可能有轮播的新闻,也有列表的新闻。

新闻以列表形式存在,不断逐个获取连接,直到当前新闻链接的时间信息不符合要求;如果需要点击查看更多按钮,则查看。

轮播的新闻按照设置的xpath得到,但注意个数,避免出现重复。

对于军事、体育等特殊模块单独执行。

 对爬取出错的模块,提示失误信息。

'''单模块'''
    def xinhua_onemokuai_urlsget(self,mokuaileibiename, mokuaileibieurl, need_url, xinhua_errormessage):
        try:
            # browswe = webdriver.Chrome(executable_path=path, chrome_options=option)
            print(mokuaileibiename)
            benciurl = mokuaileibieurl
            SpiderXinhua.browswe.get(benciurl)
            xinhua_url_base = "http://" + benciurl.split("/")[2]
            content = SpiderXinhua.browswe.page_source
            tree = etree.HTML(content)
            # 军事
            if mokuaileibiename == "军事":
                xpath_army = SpiderXinhua.Xpath_army
                army_href = tree.xpath(xpath_army)
                if army_href:
                    SpiderXinhua.need_hrefget(self,need_url, army_href)
                else:
                    xinhua_errormessage.append("新华网--军事列表数据获取失败,检查xpath是否正确!")
                xpath_army_spide = SpiderXinhua.Xpath_army_spide
                army_href_spide = tree.xpath(xpath_army_spide)
                if army_href_spide:
                    SpiderXinhua.need_hrefget(self,need_url, army_href_spide)
                else:
                    xinhua_errormessage.append("新华网--军事滚动数据获取失败,检查xpath是否正确!")
                return
            # 体育
            if mokuaileibiename == "体育":
                xpath_sports = SpiderXinhua.Xpath_sports
                sports_href = tree.xpath(xpath_sports)
                if sports_href:
                    del (sports_href[0])
                    SpiderXinhua.need_hrefget(self,need_url, sports_href)
                else:
                    xinhua_errormessage.append("新华网--体育数据获取失败,检查xpath是否正确!")
                return

            # 轮播的新闻
            xpath_info_spide = SpiderXinhua.Xpath_info_spide
            xpath_spidenum = SpiderXinhua.Xpath_spidenum
            news_href_duo = tree.xpath(xpath_info_spide)
            spidenum = tree.xpath(xpath_spidenum)
            news_href = []
            if spidenum:
                for i in range(int(spidenum[0])):
                    news_href.append(news_href_duo[i])
                for i in range(len(news_href)):
                    if str(news_href[i]).endswith("/c.html") or str(news_href[i]).endswith("/c.htm"):
                        get_date = str(news_href[i]).split("/")[-3]
                        new_date_date = datetime.datetime(int(get_date[0:4]), int(get_date[4:6]),
                                                          int(get_date[6:])).date()
                    else:
                        if re.search('^c_[0-9]{10}.htm$', str(news_href[i]).split("/")[-1]):
                            smalllist = str(news_href[i]).split("/")
                            get_ym = smalllist[-3]
                            get_d = smalllist[-2]
                            new_date_date = datetime.datetime(int(get_ym[0:4]), int(get_ym[5:]), int(get_d[0:])).date()
                        else:
                            continue
                    daysub = (self.Now_date - new_date_date).days + 1
                    if int(daysub) <= int(self.datesub):
                        if str(news_href[i])[0:1] == "/":
                            news_href[i] = xinhua_url_base + str(news_href[i])
                        need_url.append(news_href[i])
                        print(news_href[i])

            # 列表新闻
            xpath_t_start = SpiderXinhua.Xpath_t_start
            xpath_t_end = SpiderXinhua.Xpath_t_end
            xpath_h_start = xpath_t_start
            xpath_h_end = SpiderXinhua.Xpath_h_end
            if mokuaileibiename == "教育":
                xpath_t_start = SpiderXinhua.Xpath_Jt_start
                xpath_t_end = SpiderXinhua.Xpath_Jt_end
                xpath_h_start = xpath_t_start
                xpath_h_end = SpiderXinhua.Xpath_Jh_end
            numid = 1
            tryerror = 0
            goflag = True
#新闻以列表形式存在,不断逐个获取连接,直到当前新闻链接的时间信息不符合要求
            #如果需要点击查看更多按钮,则查看 
             #goflag就是决定是否继续向下获取的

            while goflag:
                xpath_info_item_t = xpath_t_start + str(numid) + xpath_t_end
                new_time = tree.xpath(xpath_info_item_t)
                if not new_time:
                    if numid == 1 and tryerror == 0:
                        xpath_t_start = SpiderXinhua.Xpath_Ft_start
                        xpath_t_end = SpiderXinhua.Xpath_Ft_end
                        xpath_h_start = xpath_t_start
                        xpath_h_end = SpiderXinhua.Xpath_Fh_end
                        tryerror = tryerror + 1
                        continue
                  #查看更多
                    lookmore = SpiderXinhua.browswe.find_element(By.XPATH, SpiderXinhua.LookmoreBtn)
                    if lookmore:
                        lookmore.click()
                        time.sleep(2)
                        content = SpiderXinhua.browswe.page_source
                        tree = etree.HTML(content)
                        continue
                    goflag = False
                    xinhua_errormessage.append(
                        "新华网--" + str(mokuaileibiename) + "列表数据获取失败,检查xpath是否正确!")
                new_date_date = datetime.datetime.strptime(new_time[0], "%Y-%m-%d").date()
                daysub = (Now_date - new_date_date).days + 1
                if daysub <= self.datesub:
                    xpath_info_item_h = xpath_h_start + str(numid) + xpath_h_end
                    news_href = tree.xpath(xpath_info_item_h)
                    if news_href:
                        if str(news_href[0])[0:1] == "/":
                            news_href[0] = xinhua_url_base + str(news_href[0])
                        if str(news_href[0])[0:3] == "../":
                            news_href[0] = xinhua_url_base + str(news_href[0])[2:]
                        need_url.append(news_href[0])
                        print(news_href[0])
                    numid = numid + 1
                else:
                    goflag = False
        except:
            xinhua_errormessage.append("新华网--" + str(mokuaileibiename) + "数据获取失败,网页格式不符,可手动查看!")

五、循环每个模块xinhuawangurlsget

'''循环每个模块'''
def xinhuawangurlsget(self,need_url, xinhua_errormessage):
    SpiderXinhua.xinhua_threadlist = []
    for ui in range(len(SpiderXinhua.xinhua_url_lists)):
        mokuaileibiename = list(SpiderXinhua.xinhua_url_lists.keys())[ui]
        mokuaileibieurl = list(SpiderXinhua.xinhua_url_lists.values())[ui]
        SpiderXinhua.xinhua_onemokuai_urlsget(self,mokuaileibiename, mokuaileibieurl, need_url, xinhua_errormessage)
    return need_url, xinhua_errormessage

六、其余函数

    '''主要'''
    def mainmain(self):
        Need_url, Xinhua_errormessage = SpiderXinhua.xinhuawangurlsget(self,SpiderXinhua.Need_url, SpiderXinhua.Xinhua_errormessage)

        self.Need_url=Need_url
        self.Xinhua_errormessage=Xinhua_errormessage
    def __init__(self,datesub,nowdate):
        self.datesub=datesub
        self.Now_date=nowdate
        SpiderXinhua.mainmain(self)

七、执行示例

设置时间间隔为1天,截止时间为当天日期

if __name__=="__main__":
    Now_date = datetime.date.today()
    axinhua=SpiderXinhua(1,Now_date)
    print(len(axinhua.Need_url))
    print(axinhua.Need_url)
    print(axinhua.Xinhua_errormessage)

执行结果为:

python selenium 网页新闻,Python,python,selenium,爬虫文章来源地址https://www.toymoban.com/news/detail-794297.html

到了这里,关于python 使用selenium等爬虫技术爬取某华网的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Python爬虫入门:使用selenium库,webdriver库模拟浏览器爬虫,模拟用户爬虫,爬取网站内文章数据,循环爬取网站全部数据。

    *严正声明:本文仅限于技术讨论与分享,严禁用于非法途径。 目录 准备工具: 思路: 具体操作: 调用需要的库: 启动浏览器驱动: 代码主体:  完整代码(解析注释): Python环境; 安装selenium库; Python编辑器; 待爬取的网站; 安装好的浏览器; 与浏览器版本相对应的

    2023年04月24日
    浏览(58)
  • 【爬虫】一次爬取某瓣top电影前250的学习记录

    先贴上爬取的脚本: import requests import re for i in range(1,11):     num=(i-1)*25     url=f\\\"https://movie.douban.com/top250?start={num}filter=\\\"     head={\\\"User-Agent\\\":\\\"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36\\\"}#伪造请求头     res=requests.get(url,headers=head)    

    2024年02月06日
    浏览(53)
  • 使用Python爬取某查查APP端(Appium自动化篇)

      某查查网站反爬虫风控还是较强的,之后会分别介绍一下 PC端协议、APP端自动化、APP端接口协议 三种采集方案。这里主要介绍APP端的自动化方式,APP端自动化方式需要登陆账号,协议的话需要签名授权( 自动化经测试没有太多限制、走协议接口的话账号与次数有捆绑 )

    2024年02月13日
    浏览(40)
  • 爬虫不会写?找ChatGPT不就完了,实战爬取某手办网~~~

    💗💗💗欢迎来到我的博客,你将找到有关如何使用技术解决问题的文章,也会找到某个技术的学习路线。无论你是何种职业,我都希望我的博客对你有所帮助。最后不要忘记订阅我的博客以获取最新文章,也欢迎在文章下方留下你的评论和反馈。我期待着与你分享知识、互

    2024年02月04日
    浏览(36)
  • Python爬虫使用selenium爬取qq群的成员信息(全自动实现自动登陆)(1)

    browser.find_element_by_xpath(‘.//ul[@id=“headerNav”]/li[4]’).click() 8.点击群管理之后,进入群管理界面,我们需要的是成员管理 WebDriverWait(browser, 1000).until( EC.presence_of_all_elements_located( (By.CLASS_NAME, ‘color-tit’) ) ) browser.find_element_by_class_name(‘color-tit’).click() 9.点击成员管理之后会重新

    2024年04月28日
    浏览(47)
  • 爬虫之牛刀小试(十):爬取某宝手机商品的销量,价格和店铺

    首先淘宝需要登录,这一点如果用selenium如何解决,只能手动登录?如果不用selenium,用cookies登录也可。但是验证码又是一个问题,现在的验证码五花八门,难以处理。 我们回到正题,假设你已经登录上淘宝了,接着我们需要找到输入框和搜索按钮,输入“手机”,点击搜索

    2024年04月10日
    浏览(62)
  • Python网络爬虫逆向分析爬取动态网页、使用Selenium库爬取动态网页、​编辑将数据存储入MongoDB数据库

    目录 逆向分析爬取动态网页 了解静态网页和动态网页区别 1.判断静态网页  2.判断动态网页  逆向分析爬取动态网页 使用Selenium库爬取动态网页 安装Selenium库以及下载浏览器补丁 页面等待  页面操作 1.填充表单 2.执行JavaScript 元素选取 Selenium库的find_element的语法使用格式如下

    2024年02月15日
    浏览(119)
  • python爬虫进阶篇:Scrapy中使用Selenium模拟Firefox火狐浏览器爬取网页信息

    接着上一篇的笔记,Scrapy爬取普通无反爬、静态页面的网页时可以顺利爬取我们要的信息。但是大部分情况下我们要的数据所在的网页它是动态加载出来的(ajax请求后传回前端页面渲染、js调用function等)。这种情况下需要使用selenium进行模拟人工操作浏览器行为,实现自动化

    2024年02月04日
    浏览(78)
  • python爬虫进阶篇:Scrapy中使用Selenium+Firefox浏览器爬取沪深A股股票行情

    上篇记录了Scrapy搭配selenium的使用方法,有了基本的了解后我们可以将这项技术落实到实际需求中。目前很多股票网站的行情信息都是动态数据,我们可以用Scrapy+selenium对股票进行实时采集并持久化,再进行数据分析、邮件通知等操作。 详情请看上篇笔记 items middlewares setti

    2024年02月04日
    浏览(66)
  • python 爬取某站视频

    也是感觉好久都没有写博客了,主要是因为学业繁忙(其实是想多摆烂一会儿。。。) 距离暑假还有一个月,各科老师也开始布置相关的期末考试内容了。。。。。。 最近英语老师给我们留了一个期末作业(大学牲又要忙起来了),内容是拍摄一个短视频,既然是视频那素

    2024年02月04日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包