Eric的新家

导航

七月在线爬虫班学习笔记(四)——相关库使用与登录问题

第四课主要内容:

  • 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安装目录’\Lib\site-packages’下(如我的电脑’C:\ProgramData\Anaconda3\Lib\site-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:\ProgramData\Anaconda3\python.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

 

posted on 2018-05-10 16:35  Eric的新家  阅读(531)  评论(2编辑  收藏  举报