博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Python模拟百度搜搜获取urls
阅读量:6309 次
发布时间:2019-06-22

本文共 6976 字,大约阅读时间需要 23 分钟。

使用Selenium 结合PhantonJS 百度关键字搜索批量获取URL

  • Python2.7 如果想在Python3 环境使用,请修改print
  • PhantonJS 将PhantonJS.exe 加入环境变量:
  • Selenium包安装
pip install selenium#CMD 查看安装信息pip show selenium
  • 如果有问题,重启电脑,或者手动指定下PhantoJS.exe路径
browser = webdriver.PhantomJS(executable_path="phantomjs.exe")

详细代码和注释

# -*- coding: utf-8 -*-"""@author:随时静听@file: baiduSpider2.py@time: 2018/09/21@email:wang_di@topsec.com.cn"""from selenium import webdriverimport time#抓取多少页pages=10#搜索的关键字keyword=u"inurl:?.asp学校"#百度搜索URL地址url="https://www.baidu.com/"#获取页面的有效地址def getUrls(driver):    urls=[]    #获取当前窗口    current_window=driver.current_window_handle    #百度跳转地址    for a in driver.find_elements_by_xpath("//div[@id='content_left']//div/h3/a"):        a.click()#点击进行跳转    #获取打开的所有窗口,一会要将打开的窗口关闭,防止耗用电脑性能    all_windows=driver.window_handles    #所有窗口包含打开的搜索页面,不能将手搜页面关闭,所以将搜索页面剔除    all_windows.remove(current_window)    #对打开的页面进行关闭操作,这里一定要先关闭,再切换窗口,当前的driver是最后一个打开页面的窗口    #因此如果先关闭的话容易导致出错,自行switchs 切换窗口已经销毁    for window in all_windows:        driver.switch_to_window(window)        urls.append(driver.current_url)#统计获取到的URL        print "[-] "+driver.current_url #打印下当前的URL    print "[-] The number of pages parsed to URL is :"+str(len(all_windows))#打印页面获取了多少URL    #复原    #执行 其实这里可以和上面的循环一起处理    for window in all_windows[:]:        driver.switch_to_window(window)        driver.close()    #重新切换到搜索页面的窗口    driver.switch_to_window(current_window)    #返回抓取的URL和切换后的web对象    return urls,driver#执行搜索动作,并将改变状态后的web对象返回def doSearch(url,keyword,driver):    driver.get(url)    driver.find_element_by_id('kw').send_keys(keyword)    driver.find_element_by_id('su').submit()    time.sleep(3)    return driver#执行点击下一页操作def toNextpage(driver):    pages = driver.find_elements_by_xpath("//div[@id='page']//a")    if pages:        pages[-1].click()    return  driver#运行def run():    pages=11    urls=[]    # driver = webdriver.Chrome()    try:        driver = webdriver.PhantomJS()        driver.implicitly_wait(6)        driver=doSearch(url,keyword,driver)        for i in range(pages+1):            url_lst,driver=getUrls(driver)            urls.extend(url_lst)            driver=toNextpage(driver)            time.sleep(2)    except Exception as e:        print "[!] There seems to be a mistake! The error message is as follows: "        print "--"*6+"Error Message Info"+"--"*6        print e        print "--" * 6 + "Error Message  Info END" + "--" * 6    finally:        #关闭浏览器        driver.quit()run()if __name__ == '__main__':    pass

基本使用

  • 由于比较懒,没有加入参数解析,也没将结果写入文件,有需要自己写一下,修改Keyword 直接运行即可
  • 修改pages值指定搜索的页面数量
  • 获取数度挺慢,不知道是不是我的电脑问题,使用Chrome挺快的

更新加入保存至文件

# -*- coding: utf-8 -*-"""@author:随时静听@file: baiduSpider2.py@time: 2018/09/21@email:wang_di@topsec.com.cn"""from selenium import webdriverfrom selenium.webdriver.common.desired_capabilities import DesiredCapabilitiesimport time#抓取多少页pages=10#搜索的关键字keyword=u"inurl:?.asp学校"#百度搜索URL地址url="https://www.baidu.com/"#获取页面的有效地址def getUrls(driver):    urls=[]    #获取当前窗口    current_window=driver.current_window_handle    #百度跳转地址    for a in driver.find_elements_by_xpath("//div[@id='content_left']//div/h3/a"):        a.click()#点击进行跳转    #获取打开的所有窗口,一会要将打开的窗口关闭,防止耗用电脑性能    all_windows=driver.window_handles    #所有窗口包含打开的搜索页面,不能将手搜页面关闭,所以将搜索页面剔除    all_windows.remove(current_window)    #对打开的页面进行关闭操作,这里一定要先关闭,再切换窗口,当前的driver是最后一个打开页面的窗口    #因此如果先关闭的话容易导致出错,自行switchs 切换窗口已经销毁    for window in all_windows:        driver.switch_to_window(window)        urls.append(driver.current_url)#统计获取到的URL        print "\t[-] "+driver.current_url #打印下当前的URL    print "[*] The number of pages parsed to URL is :"+str(len(all_windows))#打印页面获取了多少URL    #复原    #执行 其实这里可以和上面的循环一起处理    for window in all_windows[:]:        driver.switch_to_window(window)        driver.close()    #重新切换到搜索页面的窗口    driver.switch_to_window(current_window)    #返回抓取的URL和切换后的web对象    return urls,driver#执行搜索动作,并将改变状态后的web对象返回def doSearch(url,keyword,driver):    driver.get(url)    driver.find_element_by_id('kw').send_keys(keyword)    driver.find_element_by_id('su').submit()    time.sleep(3)    return driver#执行点击下一页操作def toNextpage(driver):    pages = driver.find_elements_by_xpath("//div[@id='page']//a")    if pages:        pages[-1].click()    return  driver# 获取传递的参数:def getargs():    import sys    usage='''    Usage: BaiduSpider  keywords  [nums] [filename]            keywords:   your Search keywords             nums:       default value is 6,seach max pages            filename:   result saved file name,default value is result.txt        '''    if len(sys.argv)<2:        print usage        exit()    else:        try:            keywords= sys.argv[1]            if len(sys.argv)==2:                # keywords= sys.argv[1] if sys.argv[1] else ""                nums= 6                filename="result.txt"                return (keywords,nums,filename)            if len(sys.argv)==3:                nums= int(sys.argv[2])                filename = "result.txt"                return (keywords, nums, filename)            if len(sys.argv)==4:                nums = int(sys.argv[2])                filename=sys.argv[3]                return (keywords, nums, filename)        except:            print "[!] Parameter error !"            print usage            exit()def saveData(urls,filename):    if urls:        with open(filename,'a+') as f:            for url in urls:                f.write(url+'\n')#运行def run():    # pages=11    #    # urls=[]    # driver = webdriver.Chrome()    keyword,pages,filename=getargs()    print "[*] Keywords:"+keyword    print "[*] nums:"+str(pages)    print "[*] save file name:"+filename    print "\n"    print "--"*30    urls=[]    try:        # options=webdriver.P        # options.add_argument('--ignore-certificate-errors')        dcap = dict(DesiredCapabilities.PHANTOMJS)        dcap[            "phantomjs.page.settings.userAgent"] = "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.221 Safari/537.36 SE 2.X MetaSr 1.0"        # 不加载图片        dcap["phantomjs.page.settings.loadImages"] = False        driver = webdriver.PhantomJS(desired_capabilities=dcap)        driver.set_page_load_timeout(20)        driver.implicitly_wait(6)        driver=doSearch(url,keyword,driver)        for i in range(pages+1):            print "[*] Page data loading: "+str(i+1)            url_lst,driver=getUrls(driver)            urls.extend(url_lst)            driver=toNextpage(driver)            time.sleep(5)            saveData(url_lst,filename)        print "[*] The urls total num is:" + str(len(urls))        print "[*] The spider urls save as file:" + filename    except Exception as e:        print "[!] There seems to be a mistake! The error message is as follows: "        print "--"*10+"Error Message Info"+"--"*10        print e        print "--" * 10 + "Error Message  Info END" + "--" * 10    finally:        #关闭浏览器        driver.quit()if __name__ == '__main__':    run()    pass

转载于:https://www.cnblogs.com/ssjt/articles/9688725.html

你可能感兴趣的文章
C语言OJ项目参考(2493)四则运算
查看>>
零基础入门深度学习(二):神经网络和反向传播算法
查看>>
find和xargs
查看>>
数据结构例程—— 交换排序之快速排序
查看>>
WKWebView代理方法解析
查看>>
IOS定位服务的应用
查看>>
[SMS&WAP]实例讲解制作OTA短信来自动配置手机WAP书签[附源码]
查看>>
IOS中图片(UIImage)拉伸技巧
查看>>
【工具】系统性能查看工具 dstat
查看>>
基于zepto或jquery的手机端弹出框成功,失败,加载特效
查看>>
php引用(&)
查看>>
Delphi 操作Flash D7~XE10都有 导入Activex控件 shockwave
查看>>
oracle 学习笔记之名词解释
查看>>
MySQL Cluster搭建与测试
查看>>
python数据分析画图体验
查看>>
军规15 确保集成和调用第三方APP
查看>>
Etcd和ZooKeeper,究竟谁在watch的功能表现更好?
查看>>
Shredding Company 碎纸机,dfs()枚举每一种情况,再加剪枝。
查看>>
命名空间和模块化编程 - C++快速入门39
查看>>
结构化程序设计03 - 零基础入门学习Delphi12
查看>>