精华内容
下载资源
问答
  • 动态页面和静态页面可通过检查元素查看爬取的信息和查看源代码中的信息是否一致,一致则为静态页面,反则为动态页面。因为检查查看的代码是经过处理后生成的,而查看源代码形式是你实际抓取的页面。 1.爬虫思路 ...
        

    动态页面和静态页面可通过检查元素查看爬取的信息和查看源代码中的信息是否一致,一致则为静态页面,反则为动态页面。因为检查查看的代码是经过处理后生成的,而查看源代码形式是你实际抓取的页面。

    1.爬虫思路

    构造url,关键词的部分需要通过urllib.parse.urlencode()解码

    通过urllib.request.Request()包装url

    通过urllib.request.urlopen()返回一个response对象

    最后通过simplejson装载response.read()

    2.上代码

    from urllib.request import Request,urlopen
    from urllib import parse
    import simplejson
    base_url = "https://movie.douban.com/j/search_subjects?"
    d = {
        "type":"movie",
        "tag" : "热门",
        "page_limit": 50,
        "page_start": 0
    
    
    }
    ua = {
        'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:57.0) Gecko/20100101 Firefox/57.0'
    }
    
    #url关键字的部分需要编码,看到的url是经内部转换成中文
    
    newurl = "{}{}".format(base_url,parse.urlencode(d))
    req = Request(newurl,headers = ua)
    #urllb.request.Requests是进一步包装url
    
    with urlopen(req) as rsp:
        #urlopen返回一个httpresponse对象用rsp接受    
        subjects = simplejson.loads(rsp.read())
        print(subjects['subjects'])
    

    3.结果

    :\python\venv\Scripts\python.exe C:/python/dynamicspider.py
    [{'rate': '8.8', 'cover_x': 1500, 'title': '寄生虫', 'url': 'https://movie.douban.com/subject/27010768/', 'playable': False, 'cover': 'https://img3.doubanio.com/view/photo/s_ratio_poster/public/p2561439800.jpg', 'id': '27010768', 'cover_y': 2138, 'is_new': False}, {'rate': '7.7', 'cover_x': 1500, 'title': '恶人传', 'url': 'https://movie.douban.com/subject/30211551/', 'playable': False, 'cover': 'https://img3.doubanio.com/view/photo/s_ratio_poster/public/p2555084871.jpg', 'id': '30211551', 'cover_y': 2145, 'is_new': False}, {'rate': '6.6', 'cover_x': 1200, 'title': '三更半夜居然要香蕉 爱的真实故事', 'url': 'https://movie.douban.com/subject/30203549/', 'playable': False, 'cover': 'https://img3.doubanio.com/view/photo/s_ratio_poster/public/p2537936671.jpg', 'id': '30203549', 'cover_y': 1698, 'is_new': True}, {'rate': '6.6', 'cover_x': 1000, 'title': '作家的谎言:笔忠诱罪', 'url': 'https://movie.douban.com/subject/30170120/', 'playable': False, 'cover': 'https://img3.doubanio.com/view/photo/s_ratio_poster/public/p2564834942.jpg', 'id': '30170120', 'cover_y': 1407, 'is_new': True}, {'rate': '8.9', 'cover_x': 2000, 'title': '绿皮书', 'url': 'https://movie.douban.com/subject/27060077/', 'playable': True, 'cover': 'https://img3.doubanio.com/view/photo/s_ratio_poster/public/p2549177902.jpg', 'id': '27060077', 'cover_y': 3167, 'is_new': False}, {'rate': '7.9', 'cover_x': 1786, 'title': '流浪地球', 'url': 'https://movie.douban.com/subject/26266893/', 'playable': True, 'cover': 'https://img3.doubanio.com/view/photo/s_ratio_poster/public/p2545472803.jpg', 'id': '26266893', 'cover_y': 2500, 'is_new': False}, {'rate': '5.5', 'cover_x': 2499, 'title': '追龙Ⅱ', 'url': 'https://movie.douban.com/subject/30175306/', 'playable': True, 'cover': 'https://img3.doubanio.com/view/photo/s_ratio_poster/public/p2559100280.jpg', 'id': '30175306', 'cover_y': 3500, 'is_new': False}, {'rate': '8.0', 'cover_x': 3600, 'title': '疾速备战', 'url': 'https://movie.douban.com/subject/26909790/', 'playable': False, 'cover': 'https://img3.doubanio.com/view/photo/s_ratio_poster/public/p2551393832.jpg', 'id': '26909790', 'cover_y': 5550, 'is_new': False}, {'rate': '6.4', 'cover_x': 960, 'title': '疯狂的外星人', 'url': 'https://movie.douban.com/subject/25986662/', 'playable': True, 'cover': 'https://img1.doubanio.com/view/photo/s_ratio_poster/public/p2541901817.jpg', 'id': '25986662', 'cover_y': 1359, 'is_new': False}, {'rate': '7.5', 'cover_x': 5000, 'title': '阿丽塔:战斗天使', 'url': 'https://movie.douban.com/subject/1652592/', 'playable': True, 'cover': 'https://img3.doubanio.com/view/photo/s_ratio_poster/public/p2544987866.jpg', 'id': '1652592', 'cover_y': 7413, 'is_new': False}, {'rate': '8.6', 'cover_x': 3000, 'title': '复仇者联盟4:终局之战', 'url': 'https://movie.douban.com/subject/26100958/', 'playable': False, 'cover': 'https://img3.doubanio.com/view/photo/s_ratio_poster/public/p2552058346.jpg', 'id': '26100958', 'cover_y': 4440, 'is_new': False}, {'rate': '5.8', 'cover_x': 5906, 'title': '妈阁是座城', 'url': 'https://movie.douban.com/subject/26304201/', 'playable': True, 'cover': 'https://img3.doubanio.com/view/photo/s_ratio_poster/public/p2557267786.jpg', 'id': '26304201', 'cover_y': 8268, 'is_new': False}, {'rate': '6.9', 'cover_x': 7142, 'title': '飞驰人生', 'url': 'https://movie.douban.com/subject/30163509/', 'playable': True, 'cover': 'https://img3.doubanio.com/view/photo/s_ratio_poster/public/p2542973862.jpg', 'id': '30163509', 'cover_y': 10000, 'is_new': False}, {'rate': '8.2', 'cover_x': 683, 'title': '沦落人', 'url': 'https://movie.douban.com/subject/30140231/', 'playable': False, 'cover': 'https://img3.doubanio.com/view/photo/s_ratio_poster/public/p2536165101.jpg', 'id': '30140231', 'cover_y': 960, 'is_new': False}, {'rate': '7.9', 'cover_x': 5315, 'title': '白蛇:缘起', 'url': 'https://movie.douban.com/subject/30331149/', 'playable': True, 'cover': 'https://img3.doubanio.com/view/photo/s_ratio_poster/public/p2544313786.jpg', 'id': '30331149', 'cover_y': 7441, 'is_new': False}, {'rate': '7.2', 'cover_x': 2050, 'title': '毒液:致命守护者', 'url': 'https://movie.douban.com/subject/3168101/', 'playable': True, 'cover': 'https://img3.doubanio.com/view/photo/s_ratio_poster/public/p2537158013.jpg', 'id': '3168101', 'cover_y': 2910, 'is_new': False}, {'rate': '8.6', 'cover_x': 2740, 'title': '痛苦与荣耀', 'url': 'https://movie.douban.com/subject/30198539/', 'playable': False, 'cover': 'https://img3.doubanio.com/view/photo/s_ratio_poster/public/p2554080075.jpg', 'id': '30198539', 'cover_y': 3732, 'is_new': False}, {'rate': '8.4', 'cover_x': 1944, 'title': '孟买酒店', 'url': 'https://movie.douban.com/subject/26794701/', 'playable': False, 'cover': 'https://img3.doubanio.com/view/photo/s_ratio_poster/public/p2545020183.jpg', 'id': '26794701', 'cover_y': 2880, 'is_new': False}, {'rate': '7.6', 'cover_x': 6750, 'title': '海王', 'url': 'https://movie.douban.com/subject/3878007/', 'playable': True, 'cover': 'https://img1.doubanio.com/view/photo/s_ratio_poster/public/p2541280047.jpg', 'id': '3878007', 'cover_y': 10000, 'is_new': False}, {'rate': '8.6', 'cover_x': 2200, 'title': '蜘蛛侠:平行宇宙', 'url': 'https://movie.douban.com/subject/26374197/', 'playable': True, 'cover': 'https://img3.doubanio.com/view/photo/s_ratio_poster/public/p2542867516.jpg', 'id': '26374197', 'cover_y': 3123, 'is_new': False}, {'rate': '8.1', 'cover_x': 1429, 'title': '无名之辈', 'url': 'https://movie.douban.com/subject/27110296/', 'playable': True, 'cover': 'https://img3.doubanio.com/view/photo/s_ratio_poster/public/p2539661066.jpg', 'id': '27110296', 'cover_y': 2000, 'is_new': False}, {'rate': '8.1', 'cover_x': 1000, 'title': '无双', 'url': 'https://movie.douban.com/subject/26425063/', 'playable': True, 'cover': 'https://img3.doubanio.com/view/photo/s_ratio_poster/public/p2535260806.jpg', 'id': '26425063', 'cover_y': 1400, 'is_new': False}, {'rate': '5.7', 'cover_x': 1800, 'title': '黑衣人:全球追缉', 'url': 'https://movie.douban.com/subject/19971676/', 'playable': False, 'cover': 'https://img1.doubanio.com/view/photo/s_ratio_poster/public/p2558701068.jpg', 'id': '19971676', 'cover_y': 2571, 'is_new': False}, {'rate': '7.8', 'cover_x': 1900, 'title': '阿拉丁', 'url': 'https://movie.douban.com/subject/26891256/', 'playable': False, 'cover': 'https://img3.doubanio.com/view/photo/s_ratio_poster/public/p2553992741.jpg', 'id': '26891256', 'cover_y': 2715, 'is_new': False}, {'rate': '8.3', 'cover_x': 5906, 'title': '调音师', 'url': 'https://movie.douban.com/subject/30334073/', 'playable': True, 'cover': 'https://img1.doubanio.com/view/photo/s_ratio_poster/public/p2551995207.jpg', 'id': '30334073', 'cover_y': 8268, 'is_new': False}, {'rate': '7.9', 'cover_x': 5852, 'title': '地久天长', 'url': 'https://movie.douban.com/subject/26715636/', 'playable': True, 'cover': 'https://img1.doubanio.com/view/photo/s_ratio_poster/public/p2550208359.jpg', 'id': '26715636', 'cover_y': 8192, 'is_new': False}, {'rate': '5.2', 'cover_x': 1400, 'title': '跳舞吧!大象', 'url': 'https://movie.douban.com/subject/30259043/', 'playable': True, 'cover': 'https://img1.doubanio.com/view/photo/s_ratio_poster/public/p2562934437.jpg', 'id': '30259043', 'cover_y': 2000, 'is_new': False}, {'rate': '8.7', 'cover_x': 3000, 'title': '波西米亚狂想曲', 'url': 'https://movie.douban.com/subject/5300054/', 'playable': True, 'cover': 'https://img3.doubanio.com/view/photo/s_ratio_poster/public/p2549558913.jpg', 'id': '5300054', 'cover_y': 4418, 'is_new': False}, {'rate': '6.4', 'cover_x': 1500, 'title': '哥斯拉2:怪兽之王', 'url': 'https://movie.douban.com/subject/25890017/', 'playable': False, 'cover': 'https://img3.doubanio.com/view/photo/s_ratio_poster/public/p2554370800.jpg', 'id': '25890017', 'cover_y': 2150, 'is_new': False}, {'rate': '5.4', 'cover_x': 1286, 'title': '最好的我们', 'url': 'https://movie.douban.com/subject/26266919/', 'playable': True, 'cover': 'https://img3.doubanio.com/view/photo/s_ratio_poster/public/p2557157554.jpg', 'id': '26266919', 'cover_y': 1800, 'is_new': False}, {'rate': '6.6', 'cover_x': 1350, 'title': '大侦探皮卡丘', 'url': 'https://movie.douban.com/subject/26835471/', 'playable': False, 'cover': 'https://img1.doubanio.com/view/photo/s_ratio_poster/public/p2555538168.jpg', 'id': '26835471', 'cover_y': 2000, 'is_new': False}, {'rate': '8.0', 'cover_x': 5906, 'title': '夏目友人帐', 'url': 'https://movie.douban.com/subject/27166442/', 'playable': True, 'cover': 'https://img1.doubanio.com/view/photo/s_ratio_poster/public/p2546745948.jpg', 'id': '27166442', 'cover_y': 8268, 'is_new': False}, {'rate': '8.1', 'cover_x': 1968, 'title': '无敌破坏王2:大闹互联网', 'url': 'https://movie.douban.com/subject/20438964/', 'playable': True, 'cover': 'https://img3.doubanio.com/view/photo/s_ratio_poster/public/p2537667301.jpg', 'id': '20438964', 'cover_y': 2756, 'is_new': False}, {'rate': '7.1', 'cover_x': 2048, 'title': '神奇动物:格林德沃之罪', 'url': 'https://movie.douban.com/subject/26147417/', 'playable': True, 'cover': 'https://img1.doubanio.com/view/photo/s_ratio_poster/public/p2538826177.jpg', 'id': '26147417', 'cover_y': 3035, 'is_new': False}, {'rate': '8.0', 'cover_x': 2000, 'title': '小委托人', 'url': 'https://movie.douban.com/subject/33404726/', 'playable': False, 'cover': 'https://img1.doubanio.com/view/photo/s_ratio_poster/public/p2557335459.jpg', 'id': '33404726', 'cover_y': 2865, 'is_new': False}, {'rate': '7.2', 'cover_x': 1372, 'title': '风中有朵雨做的云', 'url': 'https://movie.douban.com/subject/26728669/', 'playable': True, 'cover': 'https://img3.doubanio.com/view/photo/s_ratio_poster/public/p2552522615.jpg', 'id': '26728669', 'cover_y': 1920, 'is_new': False}, {'rate': '7.0', 'cover_x': 1080, 'title': '大黄蜂', 'url': 'https://movie.douban.com/subject/26394152/', 'playable': True, 'cover': 'https://img1.doubanio.com/view/photo/s_ratio_poster/public/p2541662397.jpg', 'id': '26394152', 'cover_y': 1590, 'is_new': False}, {'rate': '6.9', 'cover_x': 5907, 'title': '惊奇队长', 'url': 'https://movie.douban.com/subject/26213252/', 'playable': True, 'cover': 'https://img3.doubanio.com/view/photo/s_ratio_poster/public/p2546360443.jpg', 'id': '26213252', 'cover_y': 8269, 'is_new': False}, {'rate': '5.7', 'cover_x': 835, 'title': '偷心女盗', 'url': 'https://movie.douban.com/subject/3230155/', 'playable': False, 'cover': 'https://img3.doubanio.com/view/photo/s_ratio_poster/public/p2546207183.jpg', 'id': '3230155', 'cover_y': 1108, 'is_new': False}, {'rate': '7.2', 'cover_x': 3927, 'title': '影', 'url': 'https://movie.douban.com/subject/4864908/', 'playable': True, 'cover': 'https://img3.doubanio.com/view/photo/s_ratio_poster/public/p2530513100.jpg', 'id': '4864908', 'cover_y': 5788, 'is_new': False}, {'rate': '7.2', 'cover_x': 1200, 'title': '城市猎人', 'url': 'https://movie.douban.com/subject/30335799/', 'playable': False, 'cover': 'https://img3.doubanio.com/view/photo/s_ratio_poster/public/p2542455343.jpg', 'id': '30335799', 'cover_y': 1630, 'is_new': False}, {'rate': '5.7', 'cover_x': 1800, 'title': '新喜剧之王', 'url': 'https://movie.douban.com/subject/4840388/', 'playable': True, 'cover': 'https://img1.doubanio.com/view/photo/s_ratio_poster/public/p2555440969.jpg', 'id': '4840388', 'cover_y': 2524, 'is_new': False}, {'rate': '7.8', 'cover_x': 1575, 'title': '海市蜃楼', 'url': 'https://movie.douban.com/subject/30164448/', 'playable': True, 'cover': 'https://img3.doubanio.com/view/photo/s_ratio_poster/public/p2551172384.jpg', 'id': '30164448', 'cover_y': 2329, 'is_new': False}, {'rate': '7.2', 'cover_x': 1153, 'title': '密室逃生', 'url': 'https://movie.douban.com/subject/27109679/', 'playable': True, 'cover': 'https://img3.doubanio.com/view/photo/s_ratio_poster/public/p2543631842.jpg', 'id': '27109679', 'cover_y': 1700, 'is_new': False}, {'rate': '8.3', 'cover_x': 1432, 'title': '我的一级兄弟', 'url': 'https://movie.douban.com/subject/30143333/', 'playable': False, 'cover': 'https://img1.doubanio.com/view/photo/s_ratio_poster/public/p2548467439.jpg', 'id': '30143333', 'cover_y': 2048, 'is_new': False}, {'rate': '7.4', 'cover_x': 2000, 'title': '驯龙高手3', 'url': 'https://movie.douban.com/subject/19899707/', 'playable': True, 'cover': 'https://img3.doubanio.com/view/photo/s_ratio_poster/public/p2546335362.jpg', 'id': '19899707', 'cover_y': 2975, 'is_new': False}, {'rate': '6.8', 'cover_x': 1500, 'title': '红海潜水俱乐部', 'url': 'https://movie.douban.com/subject/27006407/', 'playable': False, 'cover': 'https://img1.doubanio.com/view/photo/s_ratio_poster/public/p2564653267.jpg', 'id': '27006407', 'cover_y': 2222, 'is_new': False}, {'rate': '8.2', 'cover_x': 3000, 'title': '罗马', 'url': 'https://movie.douban.com/subject/1950330/', 'playable': True, 'cover': 'https://img3.doubanio.com/view/photo/s_ratio_poster/public/p2555541430.jpg', 'id': '1950330', 'cover_y': 4393, 'is_new': False}, {'rate': '5.6', 'cover_x': 1458, 'title': '十二个想死的孩子', 'url': 'https://movie.douban.com/subject/30328584/', 'playable': False, 'cover': 'https://img3.doubanio.com/view/photo/s_ratio_poster/public/p2543516380.jpg', 'id': '30328584', 'cover_y': 2048, 'is_new': False}, {'rate': '6.7', 'cover_x': 1200, 'title': '假面饭店', 'url': 'https://movie.douban.com/subject/27126336/', 'playable': False, 'cover': 'https://img1.doubanio.com/view/photo/s_ratio_poster/public/p2531219578.jpg', 'id': '27126336', 'cover_y': 1694, 'is_new': False}]

    展开全文
  • 抓取实际访问的动态页面的url–使用正则表达式获取需要的内容–解析内容–存储内容 以上部分过程文字解释: 抓取实际访问的动态页面的url:   正则表达式: 正则表达式的使用有两种思路,可以参考个人有关其...

    实现思路:

    抓取实际访问的动态页面的url – 使用正则表达式获取需要的内容 – 解析内容 – 存储内容

    以上部分过程文字解释:

    抓取实际访问的动态页面的url:

      

    正则表达式:

    正则表达式的使用有两种思路,可以参考个人有关其简述:python实现简单爬虫以及正则表达式简述 
    更多的细节介绍可以参考网上资料,搜索关键词: 正则表达式 python

    json:

    参考网上有关json的介绍,搜索关键词: json python

    存储到数据库:

    参考网上的使用介绍,搜索关键词: 1,mysql 2,mysql python

    源码及注释

    注意:使用python的版本是 2.7

    #!/usr/bin/python
    #指明编码
    # -*- coding: UTF-8 -*- 

    #导入python库
    import urllib
    import urllib2
    import re
    import MySQLdb
    import json

    #定义爬虫类
    class crawl1:     
        def getHtml(self,url=None):
            #代理
            user_agent="Mozilla/5.0 (Windows NT 6.1; WOW64; rv:40.0) Gecko/20100101 Firefox/40.0"
            header={"User-Agent":user_agent}
            request=urllib2.Request(url,headers=header)
            response=urllib2.urlopen(request)
            html=response.read()
            return html

        def getContent(self,html,reg):
            content=re.findall(html, reg, re.S)
            return content

         #连接数据库 mysql
        def connectDB(self):
            host="192.168.85.21"
            dbName="test1"
            user="root"
            password="123456"
            #此处添加charset='utf8'是为了在数据库中显示中文,此编码必须与数据库的编码一致
            db=MySQLdb.connect(host,user,password,dbName,charset='utf8')
            return db
            cursorDB=db.cursor()
            return cursorDB

          #创建表,SQL语言。CREATE TABLE IF NOT EXISTS 表示:表createTableName不存在时就创建
        def creatTable(self,createTableName):
            createTableSql="CREATE TABLE IF NOT EXISTS "+ createTableName+"(time VARCHAR(40),title VARCHAR(100),text  VARCHAR(40),clicks VARCHAR(10))" 
            DB_create=self.connectDB()
            cursor_create=DB_create.cursor()
            cursor_create.execute(createTableSql)
            DB_create.close()
            print 'creat table '+createTableName+' successfully'      
            return createTableName 

        #数据插入表中
        def inserttable(self,insertTable,insertTime,insertTitle,insertText,insertClicks):
            insertContentSql="INSERT INTO "+insertTable+"(time,title,text,clicks)VALUES(%s,%s,%s,%s)"
    #         insertContentSql="INSERT INTO "+insertTable+"(time,title,text,clicks)VALUES("+insertTime+" , "+insertTitle+" , "+insertText+" , "+insertClicks+")"


            DB_insert=self.connectDB()
            cursor_insert=DB_insert.cursor()        
            cursor_insert.execute(insertContentSql,(insertTime,insertTitle,insertText,insertClicks))
            DB_insert.commit()
            DB_insert.close()
            print 'inert contents to  '+insertTable+' successfully'  

    url="http://baoliao.hb.qq.com/api/report/NewIndexReportsList/cityid/18/num/20/pageno/1?callback=jQuery183019859437816181613_1440723895018&_=1440723895472"


    #正则表达式,获取js,时间,标题,文本内容,点击量(浏览次数)
    reg_jason=r'.*?jQuery.*?\((.*)\)'
    reg_time=r'.*?"create_time":"(.*?)"'
    reg_title=r'.*?"title":"(.*?)".*?'
    reg_text=r'.*?"content":"(.*?)".*?'
    reg_clicks=r'.*?"counter_clicks":"(.*?)"'

    #实例化crawl()对象
    crawl=crawl1()
    html=crawl.getHtml(url)
    html_jason=re.findall(reg_jason, html, re.S)

    html_need=json.loads(html_jason[0])

    print len(html_need)
    print len(html_need['data']['list'])


    table=crawl.creatTable('yh1')
    for i in range(len(html_need['data']['list'])):
        creatTime=html_need['data']['list'][i]['create_time']
        title=html_need['data']['list'][i]['title']
        content=html_need['data']['list'][i]['content']
        clicks=html_need['data']['list'][i]['counter_clicks']
        crawl.inserttable(table,creatTime,title,content,clicks)

    展开全文
  • 动态网页抓取 AJAX(Asynchronouse JavaScript And XML)异步JavaScript和XML。过在后台与服务器进行少量数据交换,Ajax 可以使网页实现异步更新。这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行...

    动态网页抓取

    AJAX(Asynchronouse JavaScript And XML)异步JavaScript和XML。过在后台与服务器进行少量数据交换,Ajax 可以使网页实现异步更新。这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新。传统的网页(不使用Ajax)如果需要更新内容,必须重载整个网页页面。因为传统的在传输数据格式方面,使用的是XML语法。因此叫做AJAX,其实现在数据交互基本上都是使用JSON。使用AJAX加载的数据,即使使用了JS,将数据渲染到了浏览器中,在右键->查看网页源代码还是不能看到通过ajax加载的数据,只能看到使用这个url加载的html代码。

    我们有两种获取ajax数据的方式:

    1. 直接分析ajax调用的接口。然后通过代码请求这个接口。
    2. 使用Selenium+chromedriver模拟浏览器行为获取数据。
    方式 优点 缺点
    分析接口 直接可以请求到数据。不需要做一些解析工作。代码量少,性能高。 分析接口比较复杂,特别是一些通过js混淆的接口,要有一定的js功底。容易被发现是爬虫。
    selenium 直接模拟浏览器的行为。浏览器能请求到的,使用selenium也能请求到。爬虫更稳定。 代码量多。性能低。

    我们接下来讲解使用selenium+chromedriver获取动态数据。

    1.Selenium+chromedriver获取动态数据

    1.1.准备工作

    Selenium相当于是一个机器人。可以模拟人在浏览器上的一些行为,自动处理浏览器上的一些行为,比如点击,填充数据,删除cookie等。chromedriver是一个驱动Chrome浏览器的驱动程序,使用他才可以驱动浏览器。当然针对不同的浏览器有不同的driver。以下列出了不同浏览器及其对应的driver:

    1. Chrome:https://sites.google.com/a/chromium.org/chromedriver/downloads
    2. Firefox:https://github.com/mozilla/geckodriver/releases
    3. Edge:https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/
    4. Safari:https://webkit.org/blog/6900/webdriver-support-in-safari-10/

    我们这里使用Chrome来进行下面的操作。

    注意,不同版本的浏览器的驱动程序不同,请根据自己的浏览器下载对应版本。

    我们使用以下代码安装selenium库,

    pip install selenium
    

    1.2.打开与关闭网页

    我们使用selenium模拟操作浏览器需要先实例化一个Chrome对象,使用driver.get()方法打开对应网页。使用driver.close()方法关闭当前网页,或者使用driver.quit()方法关闭浏览器。例如,我们模拟打开百度页面,等待3秒并关闭,

    from selenium import webdriver
    import time
    
    driver_path = r'D:\python_class\crawl\chromedriver.exe'  # chromedriver.exe文件位置
    
    driver = webdriver.Chrome(executable_path=driver_path)  # executable_path为chromedriver.exe文件位置
    driver.get('http://www.baidu.com')  # 第一个参数为网站url
    time.sleep(3)
    driver.close()  # 关闭当前页面
    

    如果不想每次都要设置executable_path参数,可以将chromedriver.exe文件放到chrome浏览器的目录下,并将该目录地址添加到系统变量中的Path中,这样我们就无需设置executable_path参数了。

    1.3.读取网页源代码

    我们直接使用driver.page_source即可获取网页源代码,例如,我们获取百度页面的代码,

    from selenium import webdriver
    
    driver = webdriver.Chrome()
    driver.get('http://www.baidu.com')
    print(driver.page_source)  # 打印页面源代码
    driver.close()  # 关闭当前页面
    

    1.4.定位元素

    selenium支持根据类名、id、name属性值、标签名、xpath、css选择器或者By方法来定位元素。

    方式 举例
    类名 inputTag = driver.find_elements_by_class_name(“s_ipt”)[0]
    id值 inputTag = driver.find_element_by_id(“kw”)
    name属性值 inputTag = driver.find_element_by_name(“wd”)
    标签名 inputTag = driver.find_element_by_tag_name(“input”)
    xpath语法 inputTag = driver.find_element_by_xpath(’//input[@id=“kw”]’)
    css选择器 inputTag = driver.find_element_by_css_selector(’#kw’)
    By 使用By方法需要先导入,from selenium.webdriver.common.by import By,inputTag = driver.find_element(By.ID, “kw”)

    1.5.操作表单元素

    操作 方法 示例
    操作输入框 send_keys() inputTag.send_keys(‘1’)
    点击元素 click() submintTag.click()
    获取元素的指定属性 get_attribute() inputValue.get_attribute(‘placeholder’)

    1.6.行为链

    有时候在页面中的操作可能要有很多步,那么这时候可以使用鼠标行为链类ActionChains来完成。我们使用行为链的方式进行搜索,

    from selenium import webdriver
    from selenium.webdriver.common.action_chains import ActionChains
    
    # 实例化driver对象
    driver = webdriver.Chrome()
    driver.get('https://www.baidu.com')
    
    inputTag = driver.find_element_by_id('kw')  # 找到输入框
    submitTag = driver.find_element_by_id('su')  # 找到提交按钮
    
    actions = ActionChains(driver)  # 实例化行为链对象
    
    actions.move_to_element(inputTag)  # 焦点移动到输入框
    actions.send_keys_to_element(inputTag, '美国病毒')  # 提交内容
    actions.move_to_element(submitTag)  # 焦点移动到提交按钮
    actions.click(submitTag)  # 点击提交按钮
    actions.perform()  # 展示页面
    

    我们还可以实现一下操作,

    操作 方法
    点击但不松开鼠标 click_and_hold(element)
    右键点击 context_click(element)
    双击 double_click(element)

    1.7.Cookie操作

    from selenium import webdriver
    
    # 实例化driver对象
    driver = webdriver.Chrome()
    driver.get('https://www.baidu.com')
    
    print(driver.get_cookies())  # 打印cookie信息,注意,这里是cookies()方法
    print(driver.get_cookie('PSTM'))  # 获取cookie中的PSTM信息,注意,这里是cookie()方法
    print(driver.delete_cookie('PSTM'))  # 删除cookie中的PSTM信息
    

    1.8.页面操作

    1.8.1.等待页面

    现在的网页越来越多采用了 Ajax 技术,这样程序便不能确定何时某个元素完全加载出来了。如果实际页面等待时间过长导致某个dom元素还没出来,但是你的代码直接使用了这个WebElement,那么就会抛出NullPointer的异常。为了解决这个问题。所以 Selenium 提供了两种等待方式:一种是隐式等待、一种是显式等待。

    我们先来看隐式等待。

    隐式等待要调用driver.implicitly_wait()方法,我们可以设置等待时间,例如,

    from selenium import webdriver
    
    # 实例化driver对象
    driver = webdriver.Chrome()
    driver.get('https://www.baidu.com')
    
    driver.implicitly_wait(5)  # 参数为等待时间。如果5秒内页面加载完成,则取消等待;否则,5秒后返回错误
    print(driver.page_source)
    

    接下来,显示操作。

    显示等待是显示等待是表明某个条件成立后才执行获取元素的操作。也可以在等待的时候指定一个最大的时间,如果超过这个时间那么就抛出一个异常。显示等待应该使用selenium.webdriver.support.excepted_conditions期望的条件和selenium.webdriver.support.ui.WebDriverWait来配合完成。示例代码如下:

    from selenium import webdriver
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    from selenium.webdriver.common.by import By
    
    # 实例化driver对象
    driver = webdriver.Chrome()
    driver.get('https://www.baidu.com')
    
    element = WebDriverWait(driver, 5).until(EC.presence_of_element_located((By.ID, 'su')))
    # 在5秒内,id值为su的标签加载完成后,则取消等待;否则,报错
    

    以下是一些其他条件,

    等待条件 方法
    某个元素已经加载完毕了 presence_of_element_located()
    网页中所有满足条件的元素都加载完毕了 presence_of_all_emement_located()
    某个元素是可以点击了 element_to_be_cliable()
    1.8.2.切换页面

    有时候窗口中有很多子tab页面。这时候肯定是需要进行切换的。selenium提供了一个叫做switch_to_window来进行切换,具体切换到哪个页面,可以从driver.window_handles中找到,页面会以列表的形式展示,所以页面的切换使用列表下标即可。例如,

    from selenium import webdriver
    
    # 实例化driver对象
    driver = webdriver.Chrome()
    driver.get('https://www.baidu.com')  # 打开主页
    driver.execute_script("window.open('http://www.zhihu.com')")  # 以新窗口的形式打开新的页面
    driver.execute_script("window.open('http://www.douban.com')")
    print(driver.window_handles)  # 窗口的句柄
    driver.switch_to_window(driver.window_handles[0])  # 切换到页面列表中下标为0的页面
    
    1.8.3.保存页面截图

    save_screenshot()方法可以保存页面的截图,例如,

    from selenium import webdriver
    from selenium.webdriver.common.by import By
    
    # 实例化driver对象
    driver = webdriver.Chrome()
    driver.get('https://www.codingke.com')  # 打开主页
    driver.save_screenshot('codingke.png')  # 参数为图片名称
    

    1.9.设置代理与不显示浏览器

    我们可以通过添加浏览器选项的方法开启代理服务器,执行代码而不展示浏览器的操作过程。我们需要创建ChromeOptions对象,再使用add_argument()方法添加选项,最后为Chrome对象添加options参数。例如,

    from selenium import webdriver
    
    options = webdriver.ChromeOptions()
    options.add_argument("--proxy-server=http://175.42.123.88:9999")  # 添加代理服务器
    options.add_argument("--headless")  # 不打开浏览器
    options.add_argument("--disable-gpu")  # 禁用GPU
    
    driver = webdriver.Chrome(options=options)
    driver.get('http://httpbin.org/ip')
    print(driver.page_source)
    
    展开全文
  • 简述以下的代码是使用python实现的网络爬虫抓取动态网页 http://hb.qq.com/baoliao/ 。此网页中的最新、精华下面的内容是由JavaScript动态生成的。审查网页元素与网页源码是不同。以上是网页源码以上是审查网页...

    简述

    以下的代码是使用python实现的网络爬虫,抓取动态网页 http://hb.qq.com/baoliao/ 。此网页中的最新、精华下面的内容是由JavaScript动态生成的。审查网页元素与网页源码是不同。

    这里写图片描述

    这里写图片描述

    以上是网页源码

    这里写图片描述

    这里写图片描述

    以上是审查网页元素

    所以此处不能简单的使用正则表达式来获取内容。

    以下是完整的获取内容并存储到数据库的思路及源码。

    实现思路:

    抓取实际访问的动态页面的url使用正则表达式获取需要的内容解析内容存储内容

    以上部分过程文字解释:

    抓取实际访问的动态页面的url:

    在火狐浏览器中,右键打开插件 使用**firebug审查元素** *(没有这项的,要安装firebug插件),找到并打开**网络(NET)**标签页。重新加载网页,获得网页的响应信息,包括连接地址。每个连接地址都可以在浏览器中打开。本网站的动态网页访问地址是:
    http://baoliao.hb.qq.com/api/report/NewIndexReportsList/cityid/18/num/20/pageno/1?callback=jQuery183019859437816181613_1440723895018&_=1440723895472
    

    正则表达式:

    正则表达式的使用有两种思路,可以参考个人有关其简述:python实现简单爬虫以及正则表达式简述
    更多的细节介绍可以参考网上资料,搜索关键词: 正则表达式 python

    json:

    参考网上有关json的介绍,搜索关键词: json python

    存储到数据库:

    参考网上的使用介绍,搜索关键词: 1,mysql 2,mysql python

    源码及注释

    注意:使用python的版本是 2.7

    
    #!/usr/bin/python
    #指明编码
    # -*- coding: UTF-8 -*- 
    
    #导入python库
    import urllib
    import urllib2
    import re
    import MySQLdb
    import json
    
    #定义爬虫类
    class crawl1:     
        def getHtml(self,url=None):
            #代理
            user_agent="Mozilla/5.0 (Windows NT 6.1; WOW64; rv:40.0) Gecko/20100101 Firefox/40.0"
            header={"User-Agent":user_agent}
            request=urllib2.Request(url,headers=header)
            response=urllib2.urlopen(request)
            html=response.read()
            return html
    
        def getContent(self,html,reg):
            content=re.findall(html, reg, re.S)
            return content
    
         #连接数据库 mysql
        def connectDB(self):
            host="192.168.85.21"
            dbName="test1"
            user="root"
            password="123456"
            #此处添加charset='utf8'是为了在数据库中显示中文,此编码必须与数据库的编码一致
            db=MySQLdb.connect(host,user,password,dbName,charset='utf8')
            return db
            cursorDB=db.cursor()
            return cursorDB
    
          #创建表,SQL语言。CREATE TABLE IF NOT EXISTS 表示:表createTableName不存在时就创建
        def creatTable(self,createTableName):
            createTableSql="CREATE TABLE IF NOT EXISTS "+ createTableName+"(time VARCHAR(40),title VARCHAR(100),text  VARCHAR(40),clicks VARCHAR(10))" 
            DB_create=self.connectDB()
            cursor_create=DB_create.cursor()
            cursor_create.execute(createTableSql)
            DB_create.close()
            print 'creat table '+createTableName+' successfully'      
            return createTableName 
    
        #数据插入表中
        def inserttable(self,insertTable,insertTime,insertTitle,insertText,insertClicks):
            insertContentSql="INSERT INTO "+insertTable+"(time,title,text,clicks)VALUES(%s,%s,%s,%s)"
    #         insertContentSql="INSERT INTO "+insertTable+"(time,title,text,clicks)VALUES("+insertTime+" , "+insertTitle+" , "+insertText+" , "+insertClicks+")"
    
    
            DB_insert=self.connectDB()
            cursor_insert=DB_insert.cursor()        
            cursor_insert.execute(insertContentSql,(insertTime,insertTitle,insertText,insertClicks))
            DB_insert.commit()
            DB_insert.close()
            print 'inert contents to  '+insertTable+' successfully'  
    
    
    
    url="http://baoliao.hb.qq.com/api/report/NewIndexReportsList/cityid/18/num/20/pageno/1?callback=jQuery183019859437816181613_1440723895018&_=1440723895472"
    
    
    #正则表达式,获取js,时间,标题,文本内容,点击量(浏览次数)
    reg_jason=r'.*?jQuery.*?\((.*)\)'
    reg_time=r'.*?"create_time":"(.*?)"'
    reg_title=r'.*?"title":"(.*?)".*?'
    reg_text=r'.*?"content":"(.*?)".*?'
    reg_clicks=r'.*?"counter_clicks":"(.*?)"'
    
    #实例化crawl()对象
    crawl=crawl1()
    html=crawl.getHtml(url)
    html_jason=re.findall(reg_jason, html, re.S)
    
    html_need=json.loads(html_jason[0])
    
    print len(html_need)
    print len(html_need['data']['list'])
    
    
    
    
    table=crawl.creatTable('yh1')
    for i in range(len(html_need['data']['list'])):
        creatTime=html_need['data']['list'][i]['create_time']
        title=html_need['data']['list'][i]['title']
        content=html_need['data']['list'][i]['content']
        clicks=html_need['data']['list'][i]['counter_clicks']
        crawl.inserttable(table,creatTime,title,content,clicks)    
    
    展开全文
  • 需求有些网站反爬虫,会在js里面动态操作DOM渲染页面,执行js后的页面才是最终页面。 而我们在python中直接用requests.get()获取到的页面,是没执行js的页面,没有我们想要的信息。 解决方法是Selenium+PhantomJS.
  • Python爬虫抓取js添加到网页的图片

    千次阅读 热门讨论 2018-04-19 17:50:24
    采用PyQt5+urllib3+BeautifulSoup4进行动态网页的图片抓取爬虫     心血来潮,想在某个网站抓取图片,结果用requests下载下来,却发现,里面不含有图片,也...
  • Python爬虫动态网页抓取(万科更新时间)

    千次阅读 多人点赞 2021-04-28 21:50:12
    爬取的页面分为静态页面和动态页面,静态的页面爬取很常见,就如豆瓣top250的爬取,展示的内容都在HTML源代码中。而动态页面,很多内容不会出现在HTML源代码中,例如使用JavaScript时,很可能出现这种情况。 静态...
  • 很早之前就开始学习爬虫了,一直想学习爬取动态页面,正巧工作中需要用到一个船舶信息的网站,每次都是手动查询太麻烦了,昨天下午研究了一下午,总算搞透彻了,基本步骤如下: 1、启动浏览器 2、打开网页 3、...
  • 页面源代码中搜你要的数据中的关键词,若搜不出来,就说明是动态数据 只要是动态数据,直接去抓包 控制台Network ->xhr -> 点击左下角各个数据包preview,找到你想要的数据所在的那些数据包后 -> ...
  • python爬虫-->抓取动态内容

    千次阅读 2017-07-07 14:09:08
    上几篇博文讲的都是关于抓取静态网页的相关内容,但是现在市面上绝大多数主流网站都在其重要功能中依赖JavaScript,使用JavaScript时,不再是加载后立即下载所有页面内容,...这里我们将介绍两种办法来抓取动态网页数据
  • 参考: https://foofish.net/python-crawler-html2pdf.html http://www.cnblogs.com/tuohai666/p/8718107.html 最近做python 2 to 3的工作,想要爬取w3c school的python3教程并转换成pdf方便随时查看。...
  • 作者:明天依旧可好 时间:2020年7月29日 ... 写在前面:本文仅供参考学习之用,请勿用作其他用途。 1.嵌入式网页爬取 举例:最常见的分页式网页 这里我用天津市的信访页面来做示例,(地址:...进入src中地址的页面后不
  • python实现爬虫抓取段子

    千次阅读 2016-08-01 13:28:59
    但是又碍于麻烦,还要到处找,于是自己利用python写了一个小爬虫抓取煎蛋网上的段子信息,并将其存储到mysql数据库中,如下图所示*同时由于煎蛋网采用了一定的反爬虫技术,所以当抓取一定页面之后会发现,我们的ip已经被...
  • Python爬虫4.2 — ajax(动态网页数据抓取)用法教程

    千次阅读 多人点赞 2019-10-18 10:18:37
    Python爬虫4.2 — ajax[动态网页数据]用法教程综述AJAX 介绍什么是AJAX实例说明请求分析获取方式实例说明其他博文链接 综述 本系列文档用于对Python爬虫技术的学习进行简单的教程讲解,巩固自己技术知识的同时,万...
  • python 抓取lofterart动态页面

    千次阅读 2015-03-13 18:00:41
    仅作学习交流只用。 对于动态网页,可以分析其请求数据,模拟POST,只请求目的数据,占用资源较少,在网络带宽有限的情况下比webbrowser有效。 ...下载该网站里的图片。 其中图片列表是动态加载的,...#lofterart爬虫
  • 五、Python爬虫解析模块思路 一、静态文件抓取(响应文件中存在的数据) 大部分的数据都是直接写在静态文件上的,静态文件这里通常指的一定时间内不会变化的,不需要与后台进行交互的网页。 1.首先确认抓取的数据...
  • 一,尝试用BeautifulSoup抓取 先打开KFC网站门店列表页面:http://www.kfc.com.cn/kfccda/storelist/index.aspx 可以看到门店列表如下图: 打开Chrome Developer Tools观察页面结构,找到标签如下: ...
  • Python 模拟爬虫抓取知乎用户信息以及人际拓扑关系,使用scrapy爬虫框架,数据存储使用mongo数据库。  本地运行请注意:爬虫依赖mongo和rabbitmq,因此这两个服务必须正常运行和配置。为了加快下载效率,图片下载是...
  • Ajax形式的请求时JS动态渲染的一种手段,我们可以通过requests和urllib库来实现页面数据抓取,但是js动态渲染页面不仅仅是AJAX一种形式, 有的网页是由JS直接生成的,并非原始HTML,可能还不包含AJAX请求;例如一些...
  • 什么是AJAX: AJAX(Asynchronouse JavaScript And XML)异步JavaScript和XML。...传统的网页(不使用Ajax)如果需要更新内容,必须重载整个网页页面。因为传统的在传输数据格式方面,使用的是XML语法。因此叫做...
  • Python爬虫之selenium+chrome实现动态页面爬取 本文主要介绍python+selenium+chromedriver的组合运用,实现浏览器爬虫。 1.Selenium的介绍 Selenium是一个用于web应用程序测试的工具。Selenium测试直接运行在浏览器...
  • python使用spynner抓取动态页面数据

    千次阅读 2015-01-15 18:07:36
     这篇文章是我最近一直想完成的一篇文章,因为之前做的爬虫只能爬取静态页面的数据,但是现在这个时代,大部分的web页面都是动态的,经常逛的网站例如京东、淘宝等,商品列表都是js获取到后台数据后再组合成html...
  • 本文主要和大家分享python动态爬虫的实例分享,用Python实现常规的静态网页抓取时,往往是用urllib2来获取整个HTML页面,然后从HTML文件中逐字查找对应的关键字。如下所示:#encoding=utf-8import urllib2url="...
  • 动态加载数据抓取-Ajax 特点 1、右键 -> 查看网页源码中没有具体数据 2、滚动鼠标滑轮或其他动作时加载 抓取 1、F12打开控制台,页面动作抓取网络数据包 2、抓取json文件URL地址 # 控制台中 XHR :异步加载...
  • 我们实现一个非常简单的爬虫抓取网页中的列表,模拟按钮点击,并抓取修改后的内容。 代码示例 网页是从w3schools上找的,在这个链接的基础上插入了一个列表。把网页内容保存到/root/workspace/test_page.html。 ...

空空如也

空空如也

1 2 3 4 5 ... 12
收藏数 235
精华内容 94
关键字:

python爬虫抓取动态页面

python 订阅
爬虫 订阅