ホームページ  >  記事  >  ウェブフロントエンド  >  コラム: 004: Web downloader_html/css_WEB-ITnoseの利用

コラム: 004: Web downloader_html/css_WEB-ITnoseの利用

WBOY
WBOYオリジナル
2016-06-21 08:49:591103ブラウズ

クローラーコラムシリーズ

学習思考が提唱するものは、インプットとアウトプットのバランスが取れており、バランスポイントは常に上昇しているというものです。

かつて偉大な神はこう警告しました。何もすることがないなら、意味のない記事を書いてはいけません。閲覧者が理解できなくても、それはあなたの問題ではありません。問題は私が入力し続けなければならないことです。 3bb3ba5d8a8c1e677360c9d603cb067b コンセプト

Web クローラー: Web スパイダーは、Web クローラー [1]、アリ、自動インデクサー、または (FOAF ソフトウェア コンセプト センターでは) WEB スカッターとも呼ばれます。インターネットの閲覧」、またはネットワーク ロボット。これらは、インターネット検索エンジンまたは他の同様の Web サイトで、これらの Web サイトのコンテンツおよび取得方法を取得または更新するために広く使用されています。アクセス可能なすべてのページのコンテンツを自動的に収集し、検索エンジンによるさらなる処理 (ダウンロードされたページの並べ替えと並べ替え) を行うことができるため、ユーザーは必要な情報をより迅速に取得できます。

分解と再テリング: クローラーはコードの一部であり、それが実装する機能は Web ページ上の必要な情報を解析することです。

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

関連する名詞

    URL (Uniform Resource Locator): URL は、ファイル、サーバー アドレス、およびサーバー アドレスなどのさまざまな情報リソースを記述するために統一された形式を使用できます。 URL 形式は 3 つの部分で構成されます。最初の部分はプロトコル (またはサービス メソッド) です。 2 番目の部分は、リソースが保存されているホストの IP アドレスです (ポート番号を含む場合もあります)。 3 番目の部分は、ディレクトリやファイル名などのホスト リソースの特定のアドレスです。最初の部分と 2 番目の部分は「://」記号で区切られ、2 番目の部分と 3 番目の部分は「/」記号で区切られます。第 1 部と第 2 部は必須ですが、第 3 部は省略できる場合もあります。例: http://www.jianshu.com/collection/dfcf1390085c
  • Web クローラーは、これらの URL に基づいて Web ページ情報を取得し、取得した Web ページのソース コードを解析して必要な情報を取得します。

3: urllib ライブラリの使い方の紹介

python2 と python3 ではこのライブラリの使用方法が異なります。詳細については、ドキュメントを参照してください。
  • python3 では、urllib モジュールは urllib.request、urllib.parse、および urllib.error に分割されます

python3 を例に挙げます。なぜ python3 を使用するのかは聞かないでください。エンコードの問題が発生した場合は、私を理解してください。

# 代码示例# -*- coding:utf-8 -*-# To: learn module# Date:2016.04.28# Author: wuxiaoshenimport urllib.requesturl = "http://www.geekonomics10000.com/author/admin"html = urllib.request.urlopen(url)response = html.read().decode('utf-8')print(response)

ブラウザでの Web ページの部分表示のスクリーンショット:

1461832263862.png

Web ページのソース コードのスクリーンショット: で表示chrome ブラウザ

1461832494093.png

コード出力部分のスクリーンショット: 同じ単語が表示されます。これは、上記のコードが Web ページのソースを正常にキャプチャしたことを意味します。コード。

1461832317844.png


4: リクエストの使用の概要

人間のための HTTP

一般的なメソッドの紹介:

序号 方法 解释说明
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: wuxiaoshenimport requestsurl = "http://www.geekonomics10000.com/author/admin"html = requests.get(url)response = html.textprint(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: wuxiaoshenimport requestsurl = "http://yanbao.stock.hexun.com/xgq/gsyj.aspx"data = {"1": 1, "page": 4}html = requests.get(url, params=data)print(html.url)# outputhttp://yanbao.stock.hexun.com/xgq/gsyj.aspx?page=4&1=1别问我为什么后面的位置反了,又没影响正常访问。好吧。因为字典是无序的。
  • 03:响应内容读取服务器响应的内容:
# -*- coding:utf-8 -*-# To: learn module# Date:2016.04.28# Author: wuxiaoshenimport requestsurl = "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: wuxiaoshenimport requestsurl = "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: wuxiaoshenimport requestsurl = "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)# output200

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

1461836313681.png

5:实战抓取博文

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

# -*- coding:utf-8 -*-# To: learn module# Date:2016.04.28# Author: wuxiaoshenimport requestsimport reimport codecsclass 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))        passif __name__ == "__main__":    Blog_passage = LiuweipengBlog()    content = Blog_passage.download()    passage = Blog_passage.parse_content(content)    Blog_passage.save_content(passage)

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

1461837985361.png

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

1461837713238.png

抓取的开头:

1461837743668.png

网页的结尾:

1461837763015.png

抓取的结尾:

1461837795287.png

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

6:参考及说明

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

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

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

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

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
前の記事:要素セレクター次の記事:要素セレクター