专栏:004:网页下载器的使用

系列爬虫专栏

崇尚的学习思维是:输入,输出平衡,且平衡点不断攀升。

曾经有大神告诫说:没事别瞎写文章;所以,很认真的写的是能力范围内的,看客要是看不懂,不是你的问题,问题在我,得持续输入,再输出。

差不多正式涉及所谓的网页爬虫

1:框架

序号 内容 说明
01 网络爬虫知识概况 概念是理解和精进的第一步
02 urllib 简单说明使用方法
03 request 强烈建议入手
04 代码示例 使用request爬取博客
05 参考及备注 总结与说明

2:网络爬虫

  • 概念

网络爬虫:网络蜘蛛(Web spider)也叫网络爬虫(Web crawler)[1],蚂蚁(ant),自动检索工具(automatic indexer),或者(在FOAF软件概念中)网络疾走(WEB scutter),是一种“自动化浏览网络”的程序,或者说是一种网络机器人。它们被广泛用于互联网搜索引擎或其他类似网站,以获取或更新这些网站的内容和检索方式。它们可以自动采集所有其能够访问到的页面内容,以供搜索引擎做进一步处理(分检整理下载的页面),而使得用户能更快的检索到他们需要的信息。

分解复述:爬虫是一段代码,实现的功能是在网页上解析需要的信息。

  • 涉及的名词

URL(Uniform Resource Locator):统一资源定位符,URL可以用一种统一的格式来描述各种信息资源,包括文件、服务器的地址和目录等.
URL的格式由三部分组成:
第一部分是协议(或称为服务方式)。
第二部分是存有该资源的主机IP地址(有时也包括端口号)。
第三部分是主机资源的具体地址,如目录和文件名等。
第一部分和第二部分用“://”符号隔开,
第二部分和第三部分用“/”符号隔开。
第一部分和第二部分是不可缺少的,第三部分有时可以省略。
如:http://www.jianshu.com/collection/dfcf1390085c

网络爬虫就是根据这些URL获取网页信息,再对获取到的网页源代码进行解析出所需要的信息。

3:urllib 库的使用简介

python2 和 python3中使用这个库的方法不一样,具体参考文档说明
在python3中,urllib模块被拆分为urllib.request,urllib.parse 和urllib.error

以python3 为例,别问我为什么使用python3, 遇到编码问题你就懂我的好了。

序号 常用方法 解释说明
01 urllib.request.urlopen()
02 urllib.request.Request()
# 代码示例
# -*- coding:utf-8 -*-
# To: learn module
# Date:2016.04.28
# Author: wuxiaoshen
import urllib.request

url = "http://www.geekonomics10000.com/author/admin"
html = urllib.request.urlopen(url)
response = html.read().decode('utf-8')
print(response)

网页在浏览器下的部分显示截图:

1461832263862.png

网页源代码部分截图:chrome浏览器查看

1461832494093.png

代码输出部分截图:可以看到相同的字眼,这意味着,上面代码已经成功的抓取到了网页源代码。

1461832317844.png

4:requests使用介绍

HTTP for humans

常用方法介绍:

序号 方法 解释说明
01 发送请求
02 URL传递参数
03 响应内容 存在不同的响应方式
04 添加HTTP 头部 -
05 响应状态码,响应头部 -

逐个分解使用方法:url = "http://www.geekonomics10000.com/author/admin" 会经常被我用来分析爬虫知识。
本人非常喜欢这个博客:学而时嘻之

requests是第三方python库,需要自己安装。安装出问题?生命不息,折腾不止(暴露了是罗粉?)

  • 01:发送请求,继而下载网页源代码
# 实现的和urllib代码相同的功能:
# -*- coding:utf-8 -*-
# To: learn module
# Date:2016.04.28
# Author: wuxiaoshen
import requests
url = "http://www.geekonomics10000.com/author/admin"
html = requests.get(url)
response = html.text
print(response)

结果部分显示截图:

1461833622056.png
  • 02:URL传递参数

你也许经常想为URL的查询字符串(query string)传递某种数据。如果你是手工构建URL,那么数据会以键/值 对的形式置于URL中,跟在一个问号的后面。例如, httpbin.org/get?key=val

比如:url = "http://yanbao.stock.hexun.com/xgq/gsyj.aspx?1=1&page=1"
你想获取不同的网页,你通过翻页发现,只改动page后面的数字就可以了。
你有可能为了获取更多的url,会这样:
url = "http://yanbao.stock.hexun.com/xgq/gsyj.aspx?1=1&page="+str(i)

那么传递参数是怎么整的?

# -*- coding:utf-8 -*-
# To: learn module
# Date:2016.04.28
# Author: wuxiaoshen
import requests

url = "http://yanbao.stock.hexun.com/xgq/gsyj.aspx"
data = {"1": 1, "page": 4}
html = requests.get(url, params=data)
print(html.url)

# output
http://yanbao.stock.hexun.com/xgq/gsyj.aspx?page=4&1=1
别问我为什么后面的位置反了,又没影响正常访问。
好吧。因为字典是无序的。

  • 03:响应内容
    读取服务器响应的内容:
# -*- coding:utf-8 -*-
# To: learn module
# Date:2016.04.28
# Author: wuxiaoshen
import requests

url = "http://www.geekonomics10000.com/author/admin"
html = requests.get(url)
response_1 = html.text      # 
response_2 = html.content   # 以字节的方式访问请求响应体,对于非文本请求
response_3 = html.raw       # 原始响应
print(type(response_1))
print(type(response_2))
print(type(response_3))

# output
<class 'str'>
<class 'bytes'>
<class 'requests.packages.urllib3.response.HTTPResponse'>

# 一般选择第一种text响应...
  • 04:响应头部

防盗链和伪装成浏览器访问:
防盗链就是需要在请求的头部加入Referer字段, Referer 指的是HTTP头部的一个字段, 用来表示从哪儿链接到目前的网页,采用的格式是URL。换句话说,借着 HTTP Referer 头部网页可以检查访客从哪里而来,这也常被用来对付伪造的跨网站请求。
某些网站做了限制,进制爬虫的访问,此时我们可以更改HTTP的header

HTTP状态码HTTP状态码(英语:HTTP Status Code)是用以表示网页服务器HTTP响应状态的3位数字代码。
比较常见的是200响应成功。403禁止访问。
2xx成功
3xx重定向
4xx客户端错误
5xx服务器错误

# -*- coding:utf-8 -*-
# To: learn module
# Date:2016.04.28
# Author: wuxiaoshen
import requests

url = "http://blog.csdn.net/pongba"   # 刘未鹏的CSDN博客地址
html = requests.get(url)
print(html.status_code)

# output:
403

---
# 添加头部信息:
# -*- coding:utf-8 -*-
# To: learn module
# Date:2016.04.28
# Author: wuxiaoshen
import requests

url = "http://blog.csdn.net/pongba"

headers = {"User-Agent": 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.110 Safari/537.36',
           "Referer": 'http://blog.csdn.net/pongba/article/details/7911997'}
html = requests.get(url, headers=headers)
print(html.status_code)

# output
200

如何获取头部信息:截图演示:
chrome 浏览器,右键,检查。

1461836313681.png

5:实战抓取博文

获取 刘未鹏 博客:[BetterExplained]如何有效地记忆与学习 的全部博文
文章地址

# -*- coding:utf-8 -*-
# To: learn module
# Date:2016.04.28
# Author: wuxiaoshen
import requests
import re
import codecs

class LiuweipengBlog(object):
    def __init__(self):
        self.url = "http://blog.csdn.net/pongba/article/details/4033477"
        self.header = {"User-Agent": 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.110 Safari/537.36',
           "Referer": 'http://blog.csdn.net/pongba/article/details/7911997'}

        self.pattern_content = r'<div id="article_content" class="article_content">(.*?)</div>'
        self.pattern_word = r'<strong>(.*?)</strong>'


        pass

    def download(self):
        html = requests.get(self.url, headers=self.header)
        try:
            if html.status_code == 200:
                return html.text
        except:
            print("Something with it.")

        pass

    def parse_content(self, content):
        passage = re.findall(self.pattern_content, content, re.S)
        words = re.findall(self.pattern_word, str(passage), re.S)
        print(words)
        return words

        pass

    def save_content(self, passage):
        filename = "blog.txt"
        with codecs.open(filename, 'w',encoding='utf8') as f:
            f.write(str(passage))


        pass


if __name__ == "__main__":
    Blog_passage = LiuweipengBlog()
    content = Blog_passage.download()
    passage = Blog_passage.parse_content(content)
    Blog_passage.save_content(passage)

分析过程显示:正则为什么那样写:
网页源代码唯一标示啊,然后再在这里面分析,大部分文字在<strong>(.*?)</strong>
注意到写的正则没有使用很复杂的表达式,就使用了(.*?)就完成了大部分任务。

1461837985361.png

效果显示:
网页的文章开头:

1461837713238.png

抓取的开头:

1461837743668.png

网页的结尾:

1461837763015.png

抓取的结尾:

1461837795287.png

代码还存在好些值得优化的地方(不写注释的程序员,不是个好吃货)。你懂的。因为...我还有事。。
可以先直观的看看实现过程。

6:参考及说明

参考资料1:
requests文档
urllib文档

正则表达式参考教程:
爬虫系列教程

关于本人:
国内小硕,跌跌撞撞的IT学习者。
兴趣领域:爬虫及数据科学

本人正在构建一个爬虫学习付费(30)社群。付费是为了降低信噪比。社群的理念是:思维,不断的精进。
有兴趣的可以私信,限制30名。群内鼓励原创教程,不断交流精进,目前已经有小伙伴参加。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,033评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,725评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,473评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,846评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,848评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,691评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,053评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,700评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,856评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,676评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,787评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,430评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,034评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,990评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,218评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,174评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,526评论 2 343

推荐阅读更多精彩内容

  • 1 前言 作为一名合格的数据分析师,其完整的技术知识体系必须贯穿数据获取、数据存储、数据提取、数据分析、数据挖掘、...
    whenif阅读 18,052评论 45 523
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,598评论 18 139
  • 本内容为《用Python写网络爬虫》书籍内容,有兴趣的读者可以购买本书,本章的代码皆可在Python3中运行。为了...
    海人为记阅读 2,245评论 0 5
  • 放眼看,河山万里,万木峥嵘。沁河左右,涛声已去,不再见昔日公孙王侯。进士第落,阁老岭处,残墙破壁,早化入处处乌有。...
    圣贤堂阅读 423评论 0 2
  • 清晨醒来脑海的梦境如此的真 亦或者是现实想的太多 在大多数人读书之间可能多少有喜欢的女孩 然而她也受许多人追捧总是...
    缘份啊阅读 236评论 0 0