Python3.4简单爬虫实现之抓取糗事百科段子
2016-03-01 15:30
776 查看
网上的python教程大都是2.X版本的,python2.X和python3.X相比较改动比较大,好多库的用法不太一样,我安装的是3.4.1,就用3.4.1实现一下网页内容抓取
首先是库,2.7版本的urllib2库已经没有了,我导入的是:
import urllib.request
import re
首先是取得url,直接打开糗事百科直接复制网址
url='http://www.qiushibaike.com/hot/'
然后设置headers,伪装成浏览器进行访问,有的网站会有屏蔽措施,设置过headers可以绕过屏蔽
user_agent='Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
headers={'User-Agent':user_agent}
然后进行请求,这里3.4和2.7有点不一样,注意用法
request=urllib.request.Request(url=url,headers=headers)
然后获取响应结果,注意用法
response=urllib.request.urlopen(request)
此时就抓去了整个网页源代码,可以打印一下看看
content=response.read().decode('utf-8')
print(content)
如何抓取想要的内容呢?这里需要正则表达式去匹配
先看看部分源码的内容,如下:
<div class="article block untagged mb15" id='qiushi_tag_115326209'><div class="author clearfix"><a href="/users/6689931" target="_blank" rel="nofollow"><img src="http://pic.qiushibaike.com/system/avtnew/668/6689931/medium/20140301102643.jpg"
alt="狼牙蝎子尾"/></a><a href="/users/6689931" target="_blank" title="狼牙蝎子尾"><h2>狼牙蝎子尾</h2></a></div><div class="content">“懒惰是可以战胜饥饿的 ”<br/><br/>“但却输给了尿”<!--1456774385--></div><div class="thumb"><a href="/article/115326209" target="_blank"><img src="http://pic.qiushibaike.com/system/pictures/11532/115326209/medium/app115326209.jpg"
alt="懒惰是可以战胜饥饿的 " /></a></div><div class="stats"><span class="stats-vote"><i class="number">1702</i> 好笑</span><span class="stats-comments"><span class="dash"> · </span><a href="/article/115326209" data-share="/article/115326209" id="c-115326209" class="qiushi_comments"
target="_blank"><i class="number">26</i> 评论
这是一条内容,可以看出,从<div ....author...开始到</i>结束
然后就写正则匹配
pattern=re.compile('<div.*?author clearfix">.*?<h2>(.*?)</h2>.*?<div.*?content">(.*?)<!--.*?-->.*?<img src="(.*?)" alt=.*?>.*?</i>')
再然后就可以获取内容了
items=re.findall(pattern,str(content))
由于控制台不能输出图片,就把带图片的过滤掉吧
for item in items:
haveImg=re.search('img',item[2])
if not haveImg:
print(item[0]),print(item[1])
然后运行即可
附上源码图片以及运行结果:
代码估计大家都能看懂,正则表达式可能新手不太理解
我稍微说一下
.*?代表一个固定搭配,指尽可能短的匹配
(.*?)代表一个分组,是我们抓取的内容
re.S说明可以匹配到换行,如果没有re.S就啥也取不到
这个代码是初稿,比较粗糙,有兴趣的可以把它改造成面向对象的模式
此处有贴出糗事百科用户id名称,非恶意,望见谅
首先是库,2.7版本的urllib2库已经没有了,我导入的是:
import urllib.request
import re
首先是取得url,直接打开糗事百科直接复制网址
url='http://www.qiushibaike.com/hot/'
然后设置headers,伪装成浏览器进行访问,有的网站会有屏蔽措施,设置过headers可以绕过屏蔽
user_agent='Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
headers={'User-Agent':user_agent}
然后进行请求,这里3.4和2.7有点不一样,注意用法
request=urllib.request.Request(url=url,headers=headers)
然后获取响应结果,注意用法
response=urllib.request.urlopen(request)
此时就抓去了整个网页源代码,可以打印一下看看
content=response.read().decode('utf-8')
print(content)
如何抓取想要的内容呢?这里需要正则表达式去匹配
先看看部分源码的内容,如下:
<div class="article block untagged mb15" id='qiushi_tag_115326209'><div class="author clearfix"><a href="/users/6689931" target="_blank" rel="nofollow"><img src="http://pic.qiushibaike.com/system/avtnew/668/6689931/medium/20140301102643.jpg"
alt="狼牙蝎子尾"/></a><a href="/users/6689931" target="_blank" title="狼牙蝎子尾"><h2>狼牙蝎子尾</h2></a></div><div class="content">“懒惰是可以战胜饥饿的 ”<br/><br/>“但却输给了尿”<!--1456774385--></div><div class="thumb"><a href="/article/115326209" target="_blank"><img src="http://pic.qiushibaike.com/system/pictures/11532/115326209/medium/app115326209.jpg"
alt="懒惰是可以战胜饥饿的 " /></a></div><div class="stats"><span class="stats-vote"><i class="number">1702</i> 好笑</span><span class="stats-comments"><span class="dash"> · </span><a href="/article/115326209" data-share="/article/115326209" id="c-115326209" class="qiushi_comments"
target="_blank"><i class="number">26</i> 评论
这是一条内容,可以看出,从<div ....author...开始到</i>结束
然后就写正则匹配
pattern=re.compile('<div.*?author clearfix">.*?<h2>(.*?)</h2>.*?<div.*?content">(.*?)<!--.*?-->.*?<img src="(.*?)" alt=.*?>.*?</i>')
再然后就可以获取内容了
items=re.findall(pattern,str(content))
由于控制台不能输出图片,就把带图片的过滤掉吧
for item in items:
haveImg=re.search('img',item[2])
if not haveImg:
print(item[0]),print(item[1])
然后运行即可
附上源码图片以及运行结果:
代码估计大家都能看懂,正则表达式可能新手不太理解
我稍微说一下
.*?代表一个固定搭配,指尽可能短的匹配
(.*?)代表一个分组,是我们抓取的内容
re.S说明可以匹配到换行,如果没有re.S就啥也取不到
这个代码是初稿,比较粗糙,有兴趣的可以把它改造成面向对象的模式
此处有贴出糗事百科用户id名称,非恶意,望见谅
相关文章推荐
- Python Requests-学习笔记(9)-错误与异常
- Python Requests-学习笔记(8)-重定向与请求历史
- Python Requests-学习笔记(7)-Cookies
- Python Requests-学习笔记(6)-响应头
- Python Requests-学习笔记(5)-响应状态码
- python笔记
- Python Requests-学习笔记(4)-定制请求头和POST
- Python中文编码问题
- Python Requests-学习笔记(3)-处理json
- 浅析python 中__name__ = '__main__' 的作用
- 常见的排序算法及python实现
- Course3-Python文件I/O
- python爬虫--小猪短租的租房信息
- Python中的实例变量和类变量
- Python——正则表达式(3)
- Python Requests-学习笔记(2)
- 利用virtualenv在Hadoop Streaming中使用完全个性化的Python解释器
- 通过Python使用saltstack生成服务器资产清单
- Python Request-学习笔记(1)
- python清除垃圾文件