Python爬虫urllib2库基本使用
demo01
# -*- coding:utf-8 -*-
import urllib2 # 导入urllib2库
# 向指定的url发送请求, 并返回服务器相应的 类文件对象
response = urllib2.urlopen('http://www.baidu.com')
# 类文件对象支持 文件对象的操作方法, 如read()方法读取文件全部内容
html = response.read()
# 打印字符串
print html
demo02
import urllib2
# Request
# 如果需要执行更复杂的操作, 比如增加HTTP报头, 必须创建一个Request实例来作为urlopen()的参数
# 访问的url地址则作为Request实例的参数
# url 作为Request()方法的参数, 并构造返回一个Request对象
request = urllib2.Request('http://www.baidu.com')
# Request对象作为urlopen()方法的参数, 发送给服务器并接受响应
response = urllib2.urlopen(request)
html = response.read()
print html
demo03
import urllib2
# Request(url, data, headers)
# url
# data url提交的数据, POST请求
# headers 是一个字典 包含需要发送的HTTP报头的键值对
url = 'http://www.itcast.cn'
# IE9.0 的User-Agent
header = {'User-Agent': 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0;'}
request = urllib2.Request(url, headers=header)
# 通过调用Request.add_header() 添加/修改一个特定的header
request.add_header('Connection', 'keep-alive')
# 调用Request.add_header()来看header信息
# request.get_header(header_name='Connection')
response = urllib2.urlopen(request)
html = response.read()
print html
demo04
# -*- coding:utf-8 -*-
import urllib2
import random
# 随机添加/修改User-Agent
url = 'http://www.itcast.cn'
ua_list = [
"Mozilla/5.0 (Windows NT 6.1; ) Apple.... ",
"Mozilla/5.0 (X11; CrOS i686 2268.111.0)... ",
"Mozilla/5.0 (Macintosh; U; PPC Mac OS X.... ",
"Mozilla/5.0 (Macintosh; Intel Mac OS... "
]
user_agent = random.choice(ua_list)
request = urllib2.Request(url)
# 调用Request.add_header() 添加/修改一个特定的header
request.add_header('User-Agent', user_agent)
# 第一个字母大写, 后面的全部小写
request.get_header('User-agent')
response = urllib2.urlopen(request)
html = response.read()
print html
- urllib 仅可以接受URL,不能创建 设置了headers 的Request 类实例;
- 但是 urllib 提供 urlencode 方法用来GET查询字符串的产生,而 urllib2 则没有。(这是 urllib 和 urllib2 经常一起使用的主要原因)
- 编码工作使用urllib的urlencode()函数,帮我们将key:value这样的键值对转换成"key=value"这样的字符串,解码工作可以使用urllib的unquote()函数。(注意,不是urllib2.urlencode() )
# ipython2中的测试结果
In [1]: import urllib
In [2]: word = {'q': 'python爬虫'}
# urllib.urlencode()方法, 将字典键值对按URL编码转换, 从而能被web服务器接受
In [3]: urllib.urlencode(word)
Out[3]: 'q=python%E7%88%AC%E8%99%AB'
# 通过urllib.unquote()方法, 把URL编码字符串 转换回原先字符串
In [4]: print urllib.unquote('q=python%E7%88%AC%E8%99%AB')
q=python爬虫
get请求 用于我们向服务器获取数据
例 http://www.google.com.hk/search?q=Python爬虫
import urllib # 负责url编码处理
import urllib2
url = 'http://www.google.com.hk/search'
word = {'q': 'Python爬虫'}
word = urllib.urlencode(word) # 转换成url编码格式(字符串)
new_url = url + '?' + word # url首个分隔符就是?
header = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36"}
request = urllib2.Request(new_url, headers=header)
response = urllib2.urlopen(request)
print response.read()
批量爬取贴吧页面数据
mport urllib
import urllib2
"""
批量爬取贴吧页面数据
百度贴吧LOL吧
第一页:http://tieba.baidu.com/f?kw=lol&ie=utf-8&pn=0
第二页: http://tieba.baidu.com/f?kw=lol&ie=utf-8&pn=50
第三页: http://tieba.baidu.com/f?kw=lol&ie=utf-8&pn=100
贴吧中每个页面不同之处,就是url最后的pn的值,其余的都是一样的,我们可以抓住这个规律。
"""
def writeFile(html, filename):
"""
作用: 爆粗安服务器相应文件到本地磁盘文件里
:param html: 服务器响应文件
:param filename: 本地磁盘文件名
"""
print '正在存储' + filename
with open(filename, 'w') as f:
f.write(html)
print '-' * 50
def loadPage(url, filename):
"""
作用:根据url发送请求, 获取服务器响应文件
:param url: 爬取的url地址
:param filename: 文件名
:return 返回服务器相应文件
"""
print '正在下载' + filename
headers = {"User-Agent": "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0;"}
request = urllib2.Request(url, headers=headers)
response = urllib2.urlopen(request)
return response.read()
def tiebaSpider(url, beginPage, endPage):
"""
作用: 负责处理url, 分配每个url去发送请求
:param url: 需要处理的第一个url
:param beginPage: 爬虫执行的起始页面
:param endPage: 爬虫执行的截止页面
"""
for page in range(beginPage, endPage+1):
pn = (page - 1) * 50
filename = '第' + str(page) + '页.html'
# 组合完整的url, 并且pn值每次增加50
fullurl = url + '&pn=' + str(pn)
# 调用loadPage()发送请求获取HTML页面
html = loadPage(fullurl, filename)
# 将获取到的HTML页面写入本地磁盘文件
writeFile(html, filename)
# 模拟 main 函数
if __name__ == '__main__':
kw = raw_input('请输入要爬取的贴吧:')
# 输入起始页和终止页, str转成int类型
beginPage = int(raw_input('请输入起始页'))
endPage = int(raw_input('请输入终止页'))
url = 'http://tieba.baidu.com/f?'
key = urllib.urlencode({'kw': kw})
# 组合url
url = url + key
tiebaSpider(url, beginPage, endPage)


浙公网安备 33010602011771号