zoukankan      html  css  js  c++  java
  • 七月在线爬虫班学习笔记(四)——相关库使用与登录问题

    第四课主要内容:

    • Requests库
    • Beautiful Soup
    • HTML Parse
    • SqlLite
    • Douban登陆抓取案例

     

     requests运行代码示例:

    import json
    import requests
    
    from PIL import Image
    from io import BytesIO
    
    # print(dir(requests))
    
    '''
    url = 'http://www.baidu.com'
    r = requests.get(url)
    print(r.text)
    print(r.status_code)
    print(r.encoding)
    '''
    
    # 传递参数:不如http://aaa.com?pageId=1&type=content
    '''
    params = {'k1':'v1', 'k2':'v2'}
    r = requests.get('http://httpbin.org/get', params)
    print(r.url)
    '''
    
    # 二进制数据
    '''
    r = requests.get('http://i-2.shouji56.com/2015/2/11/23dab5c5-336d-4686-9713-ec44d21958e3.jpg')
    image = Image.open(BytesIO(r.content))
    image.save('meinv.jpg')
    '''
    
    # json处理
    '''
    r = requests.get('https://github.com/timeline.json')
    print(type(r.json))
    print(r.text)
    '''
    
    # 原始数据处理
    '''
    r = requests.get('http://i-2.shouji56.com/2015/2/11/23dab5c5-336d-4686-9713-ec44d21958e3.jpg', stream = True)
    with open('meinv2.jpg', 'wb+') as f:
        for chunk in r.iter_content(1024):
            f.write(chunk)
    '''
    
    # 提交表单
    '''
    form = {'username':'user', 'password':'pass'}
    r = requests.post('http://httpbin.org/post', data = form)
    print(r.text)
    r = requests.post('http://httpbin.org/post', data = json.dumps(form))
    print(r.text)
    '''
    
    # cookie
    '''
    url = 'http://www.baidu.com'
    r = requests.get(url)
    cookies = r.cookies
    for k, v in cookies.get_dict().items():
        print(k, v)
    '''
    '''
    cookies = {'c1':'v1', 'c2': 'v2'}
    r = requests.get('http://httpbin.org/cookies', cookies = cookies)
    print(r.text)
    '''
    
    # 重定向和重定向历史
    '''
    r = requests.head('http://github.com', allow_redirects = True)
    print(r.url)
    print(r.status_code)
    print(r.history)
    '''
    
    # 代理
    '''
    proxies = {'http': ',,,', 'https': '...'}
    r = requests.get('...', proxies = proxies)
    '''
        
    

     

    BeautifulSoup代码示例:

    在课程中用到了test.html,内容如下:

    <html><head><title>The Dormouse's story</title></head>
    <body>
    <p class="title" name="dromouse"><b>The Dormouse's story</b></p>
    <p class="story">Once upon a time there were three little sisters; and their names were
    <a href="http://example.com/elsie" class="sister" id="link1"><!-- Elsie --></a>,
    <a href="http://example.com/lacie" class="sister" id="link2">Lacie</a> and
    <a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>;
    and they lived at the bottom of a well.</p>
    <p class="story">...</p>
    
    from bs4 import BeautifulSoup
    
    soup = BeautifulSoup(open('test.html'), "lxml")
    print(soup.prettify())  #格式规范化后
    
    
    # Tag
    print(type(soup.title))
    print(soup.title.name)
    print(soup.title)
    
    #输出
    
    <class 'bs4.element.Tag'>
    title
    <title>The Dormouse's story</title>
    
    # String
    print(type(soup.title.string))
    print(soup.title.string)
    
    
    #输出
    
    <class 'bs4.element.NavigableString'>
    The Dormouse's story
    
    # Comment
    print(type(soup.a.string))
    print(soup.a.string)
    
    #输出
    
    <class 'bs4.element.Comment'>
     Elsie 
    
    for item in soup.body.contents:
        print(item.name)
    
    
    #输出
    
    None
    p
    None
    p
    None
    p
    
    # CSS查询
    print(soup.select('.sister'))
    print(soup.select('#link1'))
    print(soup.select('head > title'))
    a_s = soup.select('a')
    for a in a_s:
        print(a)
    
    <html>
     <head>
      <title>
       The Dormouse's story
      </title>
     </head>
     <body>
      <p class="title" name="dromouse">
       <b>
        The Dormouse's story
       </b>
      </p>
      <p class="story">
       Once upon a time there were three little sisters; and their names were
       <a class="sister" href="http://example.com/elsie" id="link1">
        <!-- Elsie -->
       </a>
       ,
       <a class="sister" href="http://example.com/lacie" id="link2">
        Lacie
       </a>
       and
       <a class="sister" href="http://example.com/tillie" id="link3">
        Tillie
       </a>
       ;
    and they lived at the bottom of a well.
      </p>
      <p class="story">
       ...
      </p>
     </body>
    </html>
    

     

    在课程中提到在安装markupbase中有个坑需要大家注意。markupbase安装方法,直接’pip install’是无法安装成功,尝试命令’pip search markupbase’得到包名’micropython-markupbase’,然后直接在网页上下载这个包,下载后里面有一个’_markupbase.py’文件,将文件名开头的’‘去掉后文件复制到python安装目录’Libsite-packages’下(如我的电脑’C:ProgramDataAnaconda3Libsite-packages‘)

    from HTMLParser import HTMLParser
    # markupbase
    
    class MyParser(HTMLParser):       #继承基类来写自己的解析器,Sax模式
        def handle_decl(self, decl):
            HTMLParser.handle_decl(self, decl)
            print('decl %s' % decl)
    
        def handle_starttag(self, tag, attrs):
            HTMLParser.handle_starttag(self, tag, attrs)
            print('<' + tag + '>')
    
        def handle_endtag(self, tag):
            HTMLParser.handle_endtag(self, tag)
            print('</' + tag + '>')
    
        def handle_data(self, data):
            HTMLParser.handle_data(self, data)
            print('data %s' % data)
    
        #<br/>
        def handle_startendtag(self, tag, attrs):
            HTMLParser.handle_startendtag(self, tag, attrs)
    
        def handle_comment(self, data):
            HTMLParser.handle_comment(self, data)
            print('data %s' % data)
    
        def close(self):
            HTMLParser.close(self)
            print('Close')
    
    demo = MyParser()
    demo.feed(open('test.html').read())
    demo.close()
    

     输出结果:

    C:ProgramDataAnaconda3python.exe D:/PycharmProjects/spider1/htmpp_sample.py
    decl DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"
    data 
    
    data 
    
    data 
    
    </meta>
    data 
    
    data Rollen Holt - cnblogs
    </title>
    data 
    
    </meta>
    data 
    
    </link>
    data 
    
    </link>
    data 
    
    </link>
    data 
    
    </link>
    data 
    
    </link>
    data 
    
    </link>
    data 
    
    </link>
    data 
    
    </link>
    data 
    
    </script>
    data 
    
    </script>
    data 
    
    </script>
    data 
    
    </script>
    data 
    
    </script>
    data 
    
    </head>
    data 
    
    data 
    
    </a>
    data 
    
    data 
    
    data 
    
    </input>
    data 
    
    </div>
    data 
    
    </form>
    data 
    
    </body>
    data 
    
    </html>
    Close
    
    Process finished with exit code 0
    

     sqlite:

    import sqlite3
    
    conn = sqlite3.connect('test.db')
    create_sql = 'create table company(id int primary key not null, emp_name text not null);'
    conn.execute(create_sql)
    insert_sql = 'insert into company values(?, ?)'
    conn.execute(insert_sql, (100, 'LY'))
    conn.execute(insert_sql, (200, 'July'))
    cursors = conn.execute('select id, emp_name from company')
    for row in cursors:
        print(row[0], row[1])
    conn.close()
    
    
    #results
    100 LY
    200 July
    

     豆瓣爬虫:

    import requests
    import html5lib
    import re
    from bs4 import BeautifulSoup
    
    s = requests.session()
    url_login = 'http://accounts.douban.com/login'
    
    formdata = {
        'redir': 'https://www.douban.com',
        'form_email': '*********@qq.com',
        'form_password': '********',
        'login': u'登陆'
    }
    headers = {'user-agent': 'Mozilla/5.0 (Windows NT 6.3; WOW64) '
                             'AppleWebKit/537.36 (KHTML, like Gecko) '
                             'Chrome/44.0.2403.157 Safari/537.36'}
    
    r = s.post(url_login, data=formdata, headers=headers)
    content = r.text
    soup = BeautifulSoup(content, 'html5lib')
    #验证码图片
    captcha = soup.find('img', id = 'captcha')
    #判断是否有验证码图片,有则处理无则跳过
    if captcha:
        captcha_url = captcha['src']
        #正则表达式
        re_captcha_id = r'<input type="hidden" name="captcha-id" value="(.*?)"/'
        captcha_id = re.findall(re_captcha_id, content)
        print(captcha_id)
        print(captcha_url)
        captcha_text = input('Please input the captcha:')
        formdata['captcha-solution'] = captcha_text
        formdata['captcha-id'] = captcha_id
        r = s.post(url_login, data=formdata, headers=headers)
        with open('contacts.txt', 'w+', encoding='utf-8') as f:
            f.write(r.text)
    

     login_cookie:

    chrome找cookie:
    1.F12,点击Network信息;
    2.选择network标签,刷新网页(在打开调试工具的情况下刷新);
    3.刷新后’Name’找到该网页url,点击 后右边选择headers,就可以看到当前网页的http头了,在requests headers里有cookie;

    import requests
    
    headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.157 Safari/537.36'}
    cookies = {'cookie': 'bid=yziFQhTcZIQ; ps=y; ll="108288"; _pk_ref.100001.8cb4=%5B%22%22%2C%22%22%2C1482927892%2C%22https%3A%2F%2Faccounts.douban.com%2Fsafety%2Fbind_resetpassword%3Fconfirmation%3Dd45af5b19bdc537f%26alias%3Dliyanan001%2540yeah.net%22%5D; ue="liyanan001@yeah.net"; dbcl2="76208527:9XkES3vv3uM"; ck=rRSb; __utmt=1; ap=1; push_noty_num=0; push_doumail_num=0; _pk_id.100001.8cb4=ea6d754ff65bcdd2.1474347257.6.1482929703.1481331480.; _pk_ses.100001.8cb4=*; __utma=30149280.2078507961.1473603369.1481331480.1482927892.8; __utmb=30149280.22.10.1482927892; __utmc=30149280; __utmz=30149280.1482927892.8.8.utmcsr=accounts.douban.com|utmccn=(referral)|utmcmd=referral|utmcct=/safety/bind_resetpassword; __utmv=30149280.7620; _vwo_uuid_v2=EB8F16618A0E0BB2959FE9B0E842F251|8cdbe50b30acbb8304a6cfd0bdf4e501'}
    url = 'http://www.douban.com'
    r = requests.get(url, cookies = cookies, headers = headers)
    with open('douban_2.txt', 'wb+') as f:
        f.write(r.content)
    

     豆瓣爬电影数据:

    import requests
    from lxml import etree
    
    s = requests.Session()
    for id in range(0, 251, 25):
        url = 'https://movie.douban.com/top250/?start-' + str(id)
        r = s.get(url)
        r.encoding = 'utf-8'
        root = etree.HTML(r.content)
        items = root.xpath('//ol/li/div[@class="item"]')
        for item in items:
            title = item.xpath('./div[@class="info"]//a/span[@class="title"]/text()')
            name = title[0].encode('gb2312', 'ingore').decode('gb2312')
            rating = item.xpath('.//div[@class="bd"]//span[@class="rating_num"]/text()')[0]
            print(name, rating)
    
    #result
    肖申克的救赎 9.6
    霸王别姬 9.5
    这个杀手不太冷 9.4
    阿甘正传 9.4
    美丽人生 9.5
    千与千寻 9.3
    泰坦尼克号 9.3
    辛德勒的名单 9.4
    盗梦空间 9.3
    机器人总动员 9.3
    三傻大闹宝莱坞 9.2
    海上钢琴师 9.2
    忠犬八公的故事 9.2
    放牛班的春天 9.2
    大话西游之大圣娶亲 9.2
    楚门的世界 9.1
    龙猫 9.1
    教父 9.2
    熔炉 9.2
    星际穿越 9.2
    乱世佳人 9.2
    触不可及 9.1
    无间道 9.0
    当幸福来敲门 8.9
    天堂电影院 9.1
    肖申克的救赎 9.6
    霸王别姬 9.5
    这个杀手不太冷 9.4
    阿甘正传 9.4
    美丽人生 9.5
    千与千寻 9.3
    泰坦尼克号 9.3
    辛德勒的名单 9.4
    盗梦空间 9.3
    机器人总动员 9.3
    三傻大闹宝莱坞 9.2
    海上钢琴师 9.2
    忠犬八公的故事 9.2
    放牛班的春天 9.2
    大话西游之大圣娶亲 9.2
    楚门的世界 9.1
    龙猫 9.1
    教父 9.2
    熔炉 9.2
    星际穿越 9.2
    乱世佳人 9.2
    触不可及 9.1
    无间道 9.0
    当幸福来敲门 8.9
    天堂电影院 9.1
    肖申克的救赎 9.6
    霸王别姬 9.5
    这个杀手不太冷 9.4
    阿甘正传 9.4
    美丽人生 9.5
    千与千寻 9.3
    泰坦尼克号 9.3
    辛德勒的名单 9.4
    盗梦空间 9.3
    机器人总动员 9.3
    三傻大闹宝莱坞 9.2
    海上钢琴师 9.2
    忠犬八公的故事 9.2
    放牛班的春天 9.2
    大话西游之大圣娶亲 9.2
    楚门的世界 9.1
    龙猫 9.1
    教父 9.2
    熔炉 9.2
    星际穿越 9.2
    乱世佳人 9.2
    触不可及 9.1
    无间道 9.0
    当幸福来敲门 8.9
    天堂电影院 9.1
    肖申克的救赎 9.6
    霸王别姬 9.5
    这个杀手不太冷 9.4
    阿甘正传 9.4
    美丽人生 9.5
    千与千寻 9.3
    泰坦尼克号 9.3
    辛德勒的名单 9.4
    盗梦空间 9.3
    机器人总动员 9.3
    三傻大闹宝莱坞 9.2
    海上钢琴师 9.2
    忠犬八公的故事 9.2
    放牛班的春天 9.2
    大话西游之大圣娶亲 9.2
    楚门的世界 9.1
    龙猫 9.1
    教父 9.2
    熔炉 9.2
    星际穿越 9.2
    乱世佳人 9.2
    触不可及 9.1
    无间道 9.0
    当幸福来敲门 8.9
    天堂电影院 9.1
    肖申克的救赎 9.6
    霸王别姬 9.5
    这个杀手不太冷 9.4
    阿甘正传 9.4
    美丽人生 9.5
    千与千寻 9.3
    泰坦尼克号 9.3
    辛德勒的名单 9.4
    盗梦空间 9.3
    机器人总动员 9.3
    三傻大闹宝莱坞 9.2
    海上钢琴师 9.2
    忠犬八公的故事 9.2
    放牛班的春天 9.2
    大话西游之大圣娶亲 9.2
    楚门的世界 9.1
    龙猫 9.1
    教父 9.2
    熔炉 9.2
    星际穿越 9.2
    乱世佳人 9.2
    触不可及 9.1
    无间道 9.0
    当幸福来敲门 8.9
    天堂电影院 9.1
    肖申克的救赎 9.6
    霸王别姬 9.5
    这个杀手不太冷 9.4
    阿甘正传 9.4
    美丽人生 9.5
    千与千寻 9.3
    泰坦尼克号 9.3
    辛德勒的名单 9.4
    盗梦空间 9.3
    机器人总动员 9.3
    三傻大闹宝莱坞 9.2
    海上钢琴师 9.2
    忠犬八公的故事 9.2
    放牛班的春天 9.2
    大话西游之大圣娶亲 9.2
    楚门的世界 9.1
    龙猫 9.1
    教父 9.2
    熔炉 9.2
    星际穿越 9.2
    乱世佳人 9.2
    触不可及 9.1
    无间道 9.0
    当幸福来敲门 8.9
    天堂电影院 9.1
    肖申克的救赎 9.6
    霸王别姬 9.5
    这个杀手不太冷 9.4
    阿甘正传 9.4
    美丽人生 9.5
    千与千寻 9.3
    泰坦尼克号 9.3
    辛德勒的名单 9.4
    盗梦空间 9.3
    机器人总动员 9.3
    三傻大闹宝莱坞 9.2
    海上钢琴师 9.2
    忠犬八公的故事 9.2
    放牛班的春天 9.2
    大话西游之大圣娶亲 9.2
    楚门的世界 9.1
    龙猫 9.1
    教父 9.2
    熔炉 9.2
    星际穿越 9.2
    乱世佳人 9.2
    触不可及 9.1
    无间道 9.0
    当幸福来敲门 8.9
    天堂电影院 9.1
    肖申克的救赎 9.6
    霸王别姬 9.5
    这个杀手不太冷 9.4
    阿甘正传 9.4
    美丽人生 9.5
    千与千寻 9.3
    泰坦尼克号 9.3
    辛德勒的名单 9.4
    盗梦空间 9.3
    机器人总动员 9.3
    三傻大闹宝莱坞 9.2
    海上钢琴师 9.2
    忠犬八公的故事 9.2
    放牛班的春天 9.2
    大话西游之大圣娶亲 9.2
    楚门的世界 9.1
    龙猫 9.1
    教父 9.2
    熔炉 9.2
    星际穿越 9.2
    乱世佳人 9.2
    触不可及 9.1
    无间道 9.0
    当幸福来敲门 8.9
    天堂电影院 9.1
    肖申克的救赎 9.6
    霸王别姬 9.5
    这个杀手不太冷 9.4
    阿甘正传 9.4
    美丽人生 9.5
    千与千寻 9.3
    泰坦尼克号 9.3
    辛德勒的名单 9.4
    盗梦空间 9.3
    机器人总动员 9.3
    三傻大闹宝莱坞 9.2
    海上钢琴师 9.2
    忠犬八公的故事 9.2
    放牛班的春天 9.2
    大话西游之大圣娶亲 9.2
    楚门的世界 9.1
    龙猫 9.1
    教父 9.2
    熔炉 9.2
    星际穿越 9.2
    乱世佳人 9.2
    触不可及 9.1
    无间道 9.0
    当幸福来敲门 8.9
    天堂电影院 9.1
    肖申克的救赎 9.6
    霸王别姬 9.5
    这个杀手不太冷 9.4
    阿甘正传 9.4
    美丽人生 9.5
    千与千寻 9.3
    泰坦尼克号 9.3
    辛德勒的名单 9.4
    盗梦空间 9.3
    机器人总动员 9.3
    三傻大闹宝莱坞 9.2
    海上钢琴师 9.2
    忠犬八公的故事 9.2
    放牛班的春天 9.2
    大话西游之大圣娶亲 9.2
    楚门的世界 9.1
    龙猫 9.1
    教父 9.2
    熔炉 9.2
    星际穿越 9.2
    乱世佳人 9.2
    触不可及 9.1
    无间道 9.0
    当幸福来敲门 8.9
    天堂电影院 9.1
    肖申克的救赎 9.6
    霸王别姬 9.5
    这个杀手不太冷 9.4
    阿甘正传 9.4
    美丽人生 9.5
    千与千寻 9.3
    泰坦尼克号 9.3
    辛德勒的名单 9.4
    盗梦空间 9.3
    机器人总动员 9.3
    三傻大闹宝莱坞 9.2
    海上钢琴师 9.2
    忠犬八公的故事 9.2
    放牛班的春天 9.2
    大话西游之大圣娶亲 9.2
    楚门的世界 9.1
    龙猫 9.1
    教父 9.2
    熔炉 9.2
    星际穿越 9.2
    乱世佳人 9.2
    触不可及 9.1
    无间道 9.0
    当幸福来敲门 8.9
    天堂电影院 9.1
    
    情不知所起一往而深
  • 相关阅读:
    24丨基础篇:Linux磁盘I-O是怎么工作的(上)
    23 | 基础篇:Linux 文件系统是怎么工作的?
    45 | 答疑(五):网络收发过程中,缓冲区位置在哪里?
    selenium相关:通过location 和 size 获取元素所在像素位置和尺寸,截取图片ROI
    python排序算法之冒泡,选择,插入
    pyspider和pyquery总结
    python之基于libsvm识别数字验证码
    selenium执行JavaScript语句:控制滚动条 聚焦元素 改变下拉选项
    python导入import
    【转】利用 selenium 的 webdrive 驱动 headless chrome
  • 原文地址:https://www.cnblogs.com/xingbiaoblog/p/9020347.html
Copyright © 2011-2022 走看看