前に書いたこと
来月は期末で色々と忙しくなり、ブログを書く暇がなくなるかもしれません 私のブログを読んでくださった方はそう思っていると思います。は「長くて臭い」「ご存知かと思いますが、1つの記事に平均2.5日かかります。今回は、以前に取ったメモを婉曲的に「スニークピーク」と名付けて公開し、今後シリーズとしてカウントします。後ほどノートの内容を整理してまとめた改訂版ができるはずです
Notes Pythonネットワークデータ集
オリジナルでない場合はコレクション-
One thought is pure, the Flames になります。プール、一つの思考が呼び覚まされ、対岸に到達することができます-
ネットワーク データ収集とは、ネットワーク サーバーからデータを要求する自動プログラムを作成し、データを解析して必要な情報を抽出することに他なりません -
通常、データを取得するために Web クローラー プログラムを作成するよりも便利な API が利用可能です -
パート 1 クローラーを作成しました
第 1 章 初期の Web クローラー
ネットワーク データの収集を開始すると、ネットワーク データのすべての詳細を感じることができます。ブラウザは、HTML、CSS、JavaScript のすべてを説明します -
Web ブラウザは、情報のパケットを作成し、送信し、取得したデータを画像、音声、ビデオ、またはテキストに解釈する非常に便利なアプリケーションです。 Web ブラウザーはコードであり、コードは分解可能であり、多くの基本コンポーネントに分解できます。書き換えたり、再利用したり、任意のものに作成したりできます -
"/pages ドメイン名が Kissg.me のサーバー上のディレクトリそして、要求されたリソースを使用してページをレンダリングします -
クローラー プログラムは複数のリクエストをサーバーに返しません ファイルのロジックでは、リクエストされた 1 つの HTML ファイルのみを読み取ることができます -
BeautifulSoup は複雑なネットワーク情報をフォーマットし、整理しますHTML タグを配置し、Python オブジェクトを使用して XML 構造情報を表示します -
まず、response.read() を呼び出して Web ページのコンテンツを取得し、次に HTML コンテンツを BeautifulSoup オブジェクトに渡します。結果の構造は次のとおりです。 -
- れーれー
- そのため、bsObj.html.body.h1 を通じてタグを抽出できます
- 要求された Web ページがサーバー上に存在しない場合、プログラムは http エラーを返し、このため urlopen 関数は HTTPError 例外をスローします。処理には try.. . else... ステートメントを使用できます
- サーバーが存在しない場合、urlopen は None オブジェクトを返しますが、これは条件判断によって単純に処理できます
- 呼び出されたタグが存在しない場合は、BeautifulSoup が返されますNone オブジェクトとその子タグをリクエストすると、AttributeError エラーが発生します。同様に、try...excel... ステートメントもそれらを処理するために使用されます。クローラーを作成するときは、コードが
例外をキャッチする- と
読みやすい- の両方を実現できるように、コード全体のレイアウトを考慮することが重要です。コードの再利用性を考慮してください 第 2 章 複雑な HTML 解析
ミケランジェロが「ダビデ」のような独創的な彫刻を完成させる方法を尋ねられたとき、彼は有名な答えを言いました。デビッドに似ていない石の部分をハンマーでたたき出します。」 (ダオとジアン) )
HTML の前戯を解析すること、ナイフを研ぐことは薪を割ることではありません: - 「このページを印刷する」を探してください。 、または、Web サイトに、より使いやすい HTML スタイルのモバイル バージョンがあるかどうかを確認します (リクエスト ヘッダーをモバイル デバイスのステータスに設定し、Web サイトのモバイル バージョンを受信します)
- js ファイルに隠された情報を見つける必要があります,
- Web ページの情報は Web ページの URL リンクから取得できます
- 他のデータ ソースを探してください。同じデータを表示する他の Web サイトはありますか? この Web サイトのデータは他の Web サイトからのものですか? css (カスケード スタイル シート、カスケーディング スタイル シート) は、クローラーに利便性を提供し、同じ変更を加えた要素に異なるスタイルを表示させることで、クローラーがより簡単にできるようにします
- findAll() の基本的な使用法。 : findAll(tag_name, dict_of_attributes)
- bsObj.tagName を使用すると、ページ内の最初に指定されたタグのみを取得できます
get_text() メソッドによって処理される HTML ドキュメント内のすべてのタグ すべてクリア、テキストのみを含む文字列を返します - findAll(tag, 属性, 再帰的, テキスト, 制限, **キーワード)& find(タグ, 属性, 再帰的, テキスト, **キーワード):
- tag - OK 単一のタグ名またはリストにすることができます複数のタグ名の (セット)
- attributes - フィールドによってカプセル化されたタグ属性と属性値。
recursive - recursive? の場合、デフォルトは True です。ドキュメントの第 1 レベルのタグの速度要件が非常に高い場合は、再帰パラメータを設定できます。 -
text - タグ名や属性の代わりにタグの内容を使用して、 -
limit - を制限します。 findAll 結果アイテムの検索 -
キーワード パラメータ - ユーザーが属性を指定できるようにするタグです。これは BeautifulSoup の技術的に冗長な機能です。キーワード パラメータが完了できるタスクは他のテクノロジーで解決できます。 -
タグ パラメータ タグを介してタグをリストします。タグのリストを取得するには .findAll() を実行します。これは実際には「OR」関係を持つフィルターです。キーワード パラメーターは「AND」関係を持つフィルターを追加して作業を簡素化できます-
Tag オブジェクト - find による BeautifulSoup オブジェクト。または findAll 、またはサブタグによって取得された一連のオブジェクトまたは単一のオブジェクトを直接呼び出します -
NavigableString オブジェクト - タグ内のテキストを表すために使用されます -
Comment オブジェクト - HTML ドキュメントのコメント タグ -
HTML ページツリーにマッピングできます -
サブタグ、つまり、親タグの次のレベル。子孫タグは、親タグの下のすべてのレベルのタグを指しますが、すべての子孫タグが子であるわけではありません。タグ-
一般に、bs 関数は常にタグの現在の子孫タグを処理します。たとえば、.findAll はすべての子孫タグの中から再帰的に検索します-
.children を使用すると、現在のタグのサブタグのみが取得されます。子孫はすべての子孫タグを取得します- .next_siblings を使用すると、名前からわかるように、オブジェクト自体は兄弟タグとして使用できないことに注意してください。対応するものは、previous_siblings、next_sibling、previous_sibling です。
単純な bsObj.table.tr または bsObj.tr の代わりに、bsObj.find("table", {" id": "giftList"}).tr を使用します。ラベルの詳細を失わずにオブジェクトの選択をより具体的にするため-
親と親はそれぞれラベル オブジェクトを取得するために使用されます (祖父は含まれますが、叔父は含まれません)。 - 正規表現を記述する前に、ターゲット文字列の構造を説明するステップ リストを作成します
- regex:
- *- 0 回を含む任意の回数繰り返します
- |- またはを意味します
- +- 少なくとも 1 回繰り返します
- []- いずれかの文字と一致します
- ()- 式のグループ化、正規表現ルールでのグループ化が最初に実行されます
- {m,n}- m から n 回繰り返します
- [^]- 角括弧内にない任意の文字と一致します
- .- 任意の 1 文字と一致します
- ^- 文字列の先頭を識別します
- - 文字をエスケープします
- $- 文字を識別します文字列の末尾
- BeautifulSoup で正規表現を使用して効率を向上させます (例: image = bsObj.findAll("img",{"src":re.compile("..imggifts/img.*.jpg")})
- 正規表現は BeautifulSoup ステートメントの任意のパラメーターとして使用できます
- タグ オブジェクトの場合、.attrs を使用してすべての属性を取得し、辞書オブジェクトを返すことができます
画像のリソースの場所を取得できます。 - BeautifulSoup では、特定の関数タイプを findAll 関数のパラメーターとして使用できます。唯一の制限は、これらの関数がパラメーター として タグを取る必要があり、 返される結果がブール型 であることです。BeautifulSoup はこの関数を使用してそれぞれを評価します。 tag オブジェクトが見つかり、評価結果は「True」です。タグは保持され、他のタグは削除されます。たとえば、suup.findAll(lambda tag: len(tag.attrs) == 2) は 2 つの属性を持つタグを返します
。 - BeautifulSoup、正規表現、ラムダの組み合わせは無敵です
- その他のHTML解析モジュール:
- lxml - 最下層、ソースコードのほとんどがCで書かれているため、処理速度が非常に速くなります
- HTMLパーサー - 組み込み
Chapter3 が収集を開始します
- Web クローラーと呼ばれる理由 彼らは Web に沿ってクロールできるため、これは本質的に再帰的な方法です。URL リンクを見つけるには、最初に取得する必要があります。 Web ページのコンテンツ、ページのコンテンツを確認し、別の URL を探し、ページのコンテンツを取得し、ループを続けます
- 使用 Web クローリングの際には、消費する必要があるネットワーク トラフィックの量を慎重に検討し、次のことを検討する必要があります。収集対象のサーバー負荷を軽減できます
- Wikipediaの6次分離理論 - 無関係な2つのエントリはスルー可能 エントリの総数が6を超えない限りリンクされます(元の2つのエントリを含む)
- このようにすると、クローラーを作成すると、リンクのクリック数を最小限に抑えて宛先サイトに効率的に到達する方法がクローラーの動作効率を高めるだけでなく、サーバーの負荷への影響も小さくなります
- クロールされるコンテンツには、多くの場合、多くの情報が含まれます。処理する前に、実際の状況に応じて不要な情報を削除する必要があります
- ランダム アルゴリズムは、均一に分散された予測が困難なデータ シーケンスを作成するように努めますが、ランダム シードは初期段階で提供される必要があります。アルゴリズム。毎回同じ「乱数」シーケンスを生成します。システムの現在時刻を乱数シードとして使用して、プログラムをよりランダムに実行できます。
Python の疑似乱数ジェネレーター。メルセンヌ ツイスター アルゴリズム (https://en.wikipedia.org/wiki/Mersenne_Twister) を使用します- サーフェイス Web は検索エンジンがクロールできるネットワークであり、ダーク Web (ダーク Web) またはディープ Web (ディープ Web) は別の部分です。不完全な統計によると、インターネット上のネットワークの約 90% は実際にはディープウェブです
- ダークネットまたはダークインターネットとしても知られるダークウェブは、完全に別の「モンスター」です。它们也建立在已有的网络基础上,但是使用 Tor 客户端,带有运行在 HTTP 之上的新协议,提供了一个信息交换的安全隧道。这类暗网页面也是可以采集的。
- 遍历整个网站的数据采集的好处:
- 生成网站地图(脉络)
- 收集数据
- 为了避免重复采集页面, 使用 set来保存已采集的页面
- 如果递归运行的次数过多, 递归程序可能会崩溃. python的默认递归限制是1000次.
- 在开始写爬虫程序之前, 应充分分析待爬取网站的html文档的格式
- 在一个异常处理语句中包裹多行语句显然是有点危险的. 首先无法识别出究竟哪行代码出现了异常, 其次前面的语句出现异常, 将直接导致后面语句的执行
- 网络爬虫位于许多新式的网络技术领域彼此交叉的中心地带. 要实现跨站的数据分析, 只要构建出可以从互联网上的网页里解析和存储数据的爬虫就可以了
- 一个网站内部的爬虫, 只需要爬取以 /开始的资源就可以了
- 在开始写爬虫跟随外链随意跳转之前, 该思考的问题:
- 我要收集哪些数据?这些数据可以通过采集几个已经确定的网站(永远是最简单的做法)完成吗?或者我的爬虫需要发现那些我可能不知道的网站吗?
- 当我的爬虫到了某个网站,它是立即顺着下一个出站链接跳到一个新网站,还是在网站上呆一会儿,深入采集网站的内容?
- 有没有我不想采集的一类网站?我对非英文网站的内容感兴趣吗?
- 如果我的网络爬虫引起了某个网站网管的怀疑,我如何避免法律责任?
- 在以任何正式目的运行代码之前, 确保已经在可能出现问题的地方都放置了检查语句
- 写代码之前拟个大纲或画个流程图, 是一个很好的编程习惯, 不仅可以为后期处理节省时间, 更重要的是可以防止自己在爬虫变得越来越复杂时乱了分寸
- 重定向- 允许一个网页在不同的域名下显示, 有2种形式:
- 服务器端重定向, 网页在加载之前先改变了url
- 客户端重定向, 跳转到新url之前网页需要加载内容
- python3版本的urllib库会自动处理重定向. 不过要注意,有时候要采集的页面的 URL 可能并不是当前所在页面的url
- 爬虫的一些基本模式: 找出页面上的所有链接, 区分内外链, 跳转到新的页面
Chapter4 使用API
- API的用处:为不同的应用提供了方便友好的接口。不同的开发者用不同的架构,甚至不同的语言编写软件都没问题——因为API设计的目的就是要成为一种通用语言,让不同的软件进行信息共享。
- API 可以通过 HTTP 协议下载文件,和 URL 访问网站获取数据的协议一样,它几乎可以实现所有在网上干的事情。API 之所以叫 API 而不是叫网站的原因,其实是首先 API 请求使用非常严谨的语法,其次 API 用 JSON 或 XML 格式表示数据,而不是HTML 格式。
- 通常api的验证方法都是用类似令牌(token)的方式调用, 每次api调用将令牌传递给服务器. token除了在url链接中传递, 还会通过请求头里的cookie将用户信息传递给服务器:
token = tokenwebRequest = urllib.request.Request("http://xxx", headers={"token": token})
- api一个重要的特征是反馈格式友好的数据, xml或json. 目前json比xml更受欢迎, 因为json文件比完整的xml文件小, 另一个原因是网络技术的改变.
- 使用get请求获取数据时, 用url路径描述获取的数据范围, 查询参数可以作为过滤器或附加请求使用.
- 一些api使用文件路径形式指定api版本, 数据和其他属性:
http://socialmediasite.com/api/v4/json/users/1234/posts?from=08012014&to=08312014
- 一些api通过请求参数的形式指定数据格式和api版本:
http://socialmediasite.com/users/1234/posts?format=json&from=08012014&to=08312014
- response.read()-> bytes
- python将json转换成字典, json数组转换成列表, json字符串转换成pyton字符串
- 如果你用API作为唯一的数据源,那么你最多就是复制别人数据库里的数据,不过都是些已经公布过的“黄花菜”。真正有意思的事情,是把多个数据源组合成新的形式,或者把 API 作为一种工具,从全新的视角对采集到的数据进行解释
- 虽然列表迭代速度更快, 但集合查找速度更快(确定一个对象是否在集合中).
- python的集合就是值为None的字典, 用到是hash表结构, 查询速度为O(1)
- 多种技术的融合, 多种数据的融合, 将得到更有用的信息
Chapter5 存储数据
- 大数据存储与数据交互能力, 在新式的程序开发中已经是重中之重了.
- 存储媒体文件的2种主要方式: 只获取url链接, 或直接将源文件下载下来
- 直接引用url链接的优点:
- 爬虫运行得更快,耗费的流量更少,因为只要链接,不需要下载文件。
- 可以节省很多存储空间,因为只需要存储 URL 链接就可以。
- 存储 URL 的代码更容易写,也不需要实现文件下载代码。
- 不下载文件能够降低目标主机服务器的负载。
- 直接引用url链接的缺点:
- 这些内嵌在网站或应用中的外站 URL 链接被称为盗链(hotlinking), 每个网站都会实施防盗链措施。
- 因为链接文件在别人的服务器上,所以应用就要跟着别人的节奏运行了。
- 盗链是很容易改变的。如果盗链图片放在博客上,要是被对方服务器发现,很可能被恶搞。如果 URL 链接存起来准备以后再用,可能用的时候链接已经失效了,或者是变成了完全无关的内容。
- python3的urllib.request. urlretrieve可以根据文件的url下载文件:
from urllib.request import urlretrievefrom urllib.request import urlopenfrom bs4 import BeautifulSouphtml = urlopen("http://www.pythonscraping.com")bsObj = BeautifulSoup(html)imageLocation = bsObj.find("a", {"id": "logo"}).find("img")["src"]urlretrieve (imageLocation, "logo.jpg")
- csv(comma-separated values, 逗号分隔值)是存储表格数据的常用文件格式
- 网络数据采集的一个常用功能就是获取html表格并写入csv
- 除了用户定义的变量名,mysql是不区分大小写的, 习惯上mysql关键字用大写表示
- 连接与游标(connection/cursor)是数据库编程的2种模式:
- 连接模式除了要连接数据库之外, 还要发送数据库信息, 处理回滚操作, 创建游标对象等
- 一个连接可以创建多个游标, 一个游标跟踪一种状态信息, 比如数据库的使用状态. 游标还会包含最后一次查询执行的结果. 通过调用游标函数, 如 fetchall获取查询结果
- 游标与连接使用完毕之后,务必要关闭, 否则会导致连接泄漏, 会一直消耗数据库资源
- 使用 try ... finally语句保证数据库连接与游标的关闭
- 让数据库更高效的几种方法:
- 给每张表都增加id字段. 通常数据库很难智能地选择主键
- 用智能索引, CREATE INDEX definition ON dictionary (id, definition(16));
- 选择合适的范式
- 发送Email, 通过爬虫或api获取信息, 设置条件自动发送Email! 那些订阅邮件, 肯定就是这么来的!
Chapter6 读取文档
- 互联网的最基本特征: 作为不同类型文件的传输媒体
- 互联网不是一个html页面的集合, 它是一个信息的集合, 而html文件只是展示信息的一个框架
- 从最底层的角度看, 所有文档都是01的编码, 而任意类型的文件的唯一区别就在于,它们的01在面向用户的转换方式不同
- utf-8的全称: Universal Character Set - Transformation Format 8 bit
- utf-8的每个字符开头有一个标记,表示该字符用几个字节表示.一个字符最多可以是4字节, 但字节信息里还包括一部分设置信息, 因此全部32位不会都用, 最多使用21位
- utf8利用ascii的填充位让所有以”0”开头的字节表示该字符占用1个字节. 因此, 在英文字符在ascii和uft8两个编码方式下表示一样
- python默认将文本读成ascii编码格式
- utf8不能处理iso编码格式. 因此做数据采集工作时,尤其对国际网咱, 最好先看看meta标签内容, 用网站推荐的编码方式读取页面内容
- 几种读取在线文件的方法:
- 下载读取
- 从网上直接将文件读成一个字符串, 然后将其转换成一个StringIO对象, 使其具有文件的属性:
dataFile = io.StringIO(data)
- csv.reader的返回对象是可迭代的, 而且由list对象构成.
- csv.DictReader将csv文件的每一行转换成python字典返回, 并将字段列表(标题栏)保存在dictReader.fieldnames里
- pdf的文字提取
- .docx的文字提取:
- 从文件读取xml, 将文档读成一个二进制对象(BytesIO), 再用zipfile解压(所有.docx文件为了节省空间都进行过压缩), 再读取解压文件, 就变成了xml
from zipfile import ZipFilefrom urllib.request import urlopenfrom io import BytesIOwordFile = urlopen("http://pythonscraping.com/pages/AWordDocument.docx").read()wordFile = BytesIO(wordFile)document = ZipFile(wordFile)xml_content = document.read("word/document.xml")print(xml_content.decode("utf-8"))
Part2 高阶数据采集
- 网站的真实故事其实都隐藏在js, 登录表单和网站反爬取措施的背后
Chapter7 数据清洗
- 用regex移除不想要的字符, 如换行符(\n). 剔除字符的过程, 合理的先后顺序能省很多力
- 用 先以utf8格式编码,再以ascii方法解码 的方式,可以一定程度上剔除unicode字符
- 数据标准化要确保清洗后的数据在语言学或逻辑上是等价的
- python的 OrderedDict,能解决字典无序排列的问题
- 数据标准化时,根据投入计算能力的多少,还可以再考虑大小写(python与Python),单词等价(1st与first),连字符的使用(co-ordinated与coordinated),拼写错误,语病等因素
- 对连字符的一个处理是,将其去掉或转换成其他字符,比如空格
Chapter8 自然语言处理
概括数据
马尔可夫模型
- 马尔可夫文字生成器(markov text generator)- 基于一种常用于分析大量随机事件的马尔可夫模型. 随机事件的特点是一个离散事件发生之后, 另一个离散事件将在前一个事件的条件下以一定概率发生
- 在马尔可夫模型描述的天气系统中,如果今天是晴天,那么明天有70%的可能是晴天,20%的可能多云,10% 的可能下雨。如果今天是下雨天,那么明天有 50% 的可能也下雨,25% 的可能是晴天,25% 的可能是多云
- 马尔可夫模型需要注意的点:
- 任何一个节点引出的所有可能的总和必须等于 100%。无论是多么复杂的系统,必然会在下一步发生若干事件中的一个事件。
- 只有当前节点的状态会影响下一个状态。
- 有些节点可能比其他节点较难到达
- google的pagerank算法也是基于马尔可夫模型的, 将网站看作节点, 入站/出站链接作为节点的连线. 连接某个节点的可能性(linklihood)表示一个网站的相对关注度
- 马尔可夫文字生成器的工作原理: 对文献中的每一个单词进行有效处理, 再建立一个二维字典, 用于统计二元词组的词频. 每次以当前单词所在节点为查询表, 选择下一个节点. 随机生成一个权重, 用词频减权重, 一旦权重减为非正数, 确定该单词为下一单词. 词频高的单词使权重减小得更厉害, 因此更容易获得
- 在寻找有向图的最短路径问题中, 效果最好且最常用的方法是 广度优先搜索(breadth-first search, bfs)
自然语言处理
- 哪些单词使用得最频繁?哪些单词用得最少?一个单词后面跟着哪几个单词?这些单词是如何组合在一起的?
- nltk, 用于识别和标记英语文本中各词的词性.
- nltk很擅长生成一些 统计信息,包括对一段文字的 单词数量、 单词频率和 单词词性的统计
- 用nltk做统计分析一般从 Text对象开始`
from nltk import word_tokenizefrom nltk import Texttokens = word_tokenize("Here is some not very interesting text")text = Text(tokens)
- word_tokenize函数的参数可以是任何python字符串, 其将字符串按语义分割成单词
- 文本对象可以像普通的python list那样操作, 好像它们就是一个包含文本里所有单词的list一样.
- 将文本对象放到一个 频率分布对象FreqDist中, 可查看哪些单词是最常用的, 以及单词的频率等
- bigrams模块的 bigrams函数作用于文本对象, 得到一个 bigrams(2-gram)的生成器对象, 其也可以作为参数传入 FreqDist, 得到频率分布对象
- 更一般的情况, 可以导入 ngrams模块, ngrams函数被用来将文本对象分解成任意规模的 n-gram序列,
- nltk库设计了许多不同的工具和对象来组织, 统计, 排序和度量大段文字的含义
- nltk默认使用 宾夕法尼亚大学的 Penn Treebank项目的 语料标记部分
- nltk可以用它的超级大字典分析文本内容, 帮助寻找单词的含义. nltk的一个基本功能是识别句子中各个词的词性
- nltk用英语的上下文无关文法(context-free grammar)识别词性. 上下文无关文法基本上可以看成一个规则集合,用一个有序的列表确定一个词后面可以跟哪些词
- 对 nltk进行训练, 创建一个全新的上下文无关文法规则, 比如用 Penn Treebank词性标记手工完成语言的大部分文本的语义标记, 将结果传给 nltk, 训练它对未标记文本的语义标记.
- 网络数据采集经常需要处理搜索的问题, 比如采集的文字的词性, 举例, 希望采集是动词飞的fly, 而过滤掉名词苍蝇的fly
- 自然语言中的许多歧义问题都可以用 nltk的 pos_tag解决, 不只是搜索目标单词或短语, 而是搜索带标记的目标单词或短语,这样可以大大提高爬虫搜索的准确率和效率
Chapter9 穿越网页表单与登录窗口进行采集
- 利用post方法, 将信息推送到服务器进行存储与分析
- 页面表单基本上可以看成一种用户提交post请求的方式, 且这种请求方式是服务器能够理解和使用的
Requests库
- Requests库是一个擅长处理复杂的http请求, cookie, header等内容的第三方库
提交一个基本表单
- 大多数网页表单都是由一些 HTML 字段、一个提交按钮、一个在表单处理完之后跳转的“执行结果”(表单属性 action 的值)页面构成。
- 字段的名称决定了表单被确认后要被传送到服务器上的变量名称
- 表单的真实行为发生在 action指定的页面
- HTML 表单的目的,只是帮助网站的访问者发送格式合理的请求,向服务器请求没有出现的页面
- 大多数情况下, 提交表单只需要注意:
- 提交数据的字段名称
- 表单的 action属性, 即表单提交后网站会显示的页面
单选按钮, 复选框和其他输入
- 无论表单的字段看起来多么复杂,仍然只有两件事是需要关注的: 字段名称和 值。字段名称可以通过查看源代码寻找 name属性轻易获得
- 字段的值有时会比较复杂. 如果不确定一个输入字段指定数据格式, 可 跟踪浏览器正在通过网站发出或接受的get和post请求的内容.
- 跟踪get请求效果最好也最直接的手段是看网站的url链接, ?xxx=xxx&xxx=...
- 复杂的 post表单, 可查看浏览器向服务器传递的参数, 用chrome的 F12
提交文件和图像
- 用 requests处理文件上传的方式与提交普通表单类似:
import requestsfile = {"image": open("filename", "rb")}response = requests.post("http://...", data = file)
处理登录和cookie
- 大多数新式的网站都用 cookie跟踪用户是否已登录的状态信息。一旦网站验证了登录权证,它就会将它们保存在浏览器的 cookie 中,里面通常包含一个服务器生成的 令牌、 登录有效时限和 状态跟踪信息。网站会把这个 cookie 当作信息验证的证据,在你浏览网站的每个页面时出示给服务器。
- obj.cookies.method从响应中获取 cookie, 再通过 cookies参数将 cookie发送给服务器
- 使用 session对象, 可以 持续跟踪会话信息, 比如cookie, header, 甚至运行http协议的信息.
- 使 session的方法就是, 创建 Session对象, 再用 Session对象发送请求
- 写爬虫时, 应持续关注cookie的状态, 掌握它们在可控范围内非常重要. 这样可以避免痛苦地调试和追寻网站行为异常,节省很多时间。
- 在cookie发明之前, 处理网站登录常用的方法是用 http基本接入认证(http basic access authentication), requests库的 auth模块专门用来处理http认证:
import requestsfrom requests.auth import AuthBasefrom requests.auth import HTTPBasicAuthauth = HTTPBasicAuth('ryan', 'password')r = requests.post(url="http://pythonscraping.com/pages/auth/login.php", auth=auth) # HTTPBasicAuth对象作为auth参数传递到请求
其他表单问题
- 表单是网络恶意机器人(malicious bots)酷爱的网站切入点。
- 新式的网站经常在HTML 中使用很多安全措施,让表单不能被快速穿越
Chapter10 采集 JavaScript
- JavaScript 是网络上最常用也是支持者最多的 客户端脚本语言。它可以收集用户的跟踪数据,不需要重载页面直接提交表单,在页面嵌入多媒体文件,甚至运行网页游戏
JavaScript 简介
- JavaScript 是一种弱类型语言, 所有变量都用 var关键字进行定义, 可以将函数作为变量使用
- 常用的 JavaScript 库
- jQuery:
- 一个网站使用 jQuery的特征是源代码里包含了 jQuery入口.
- jQuery 可以动态地创建 HTML 内容,只有在 JavaScript 代码执行之后才会显示。如果用传统的方法采集页面内容,就只能获得 JavaScript 代码执行之前页面上的内容
- 这些页面还可能包含动画、用户交互内容和嵌入式媒体,这些内容对网络数据采集都是挑战。
- Google Analytics
- 如果网站使用了Google Analytics,在页面底部会有类似 e508924deac74ee69da68f925ca1d23b的 JavaScript 代码
- 如果一个网站使用了 Google Analytics 或其他类似的网络分析系统,而不想让网站知道在采集数据,就要确保把那些分析工具的 cookie 或者所有 cookie 都关掉。
- Google Map
- 在 Google 地图上,显示一个位置最常用的方法就是用标记
var marker = new google.maps.Marker({ position: new google.maps.LatLng(-25.363882,131.044922), map: map, title: 'Some marker text'});
- 取出google.maps.LatLng()里的坐标, 生成一组经纬度坐标值, 再通过google的 地理坐标反向查询api(https://developers.google.com/maps/documentation/javascript/examples/geocoding-reverse), 就可以将经纬度坐标组解析成格式规范的地址, 可存储或分析
ajax和动态html
- 提交表单之后,或从服务器获取信息之后,网站的页面不需要重新刷新,那么访问的网站就在用 Ajax 技术。
- Ajax(Asynchronous JavaScript and XML)其实并不是一门语言,而是用来完成网络任务的一系列技术, 网站不需要使用单独的页面请求就可以和网络服务器进行交互
- 动态 HTML(dynamic HTML, DHTML)也是一系列用于解决网络问题的技术集合。DHTML 是用 客户端语言改变页面的 HTML 元素(HTML、CSS,或者二者皆被改变). 是否使用了DHTML, 关键要看有没有用 JavaScript 控制 HTML 和 CSS 元素
- 有时, 网页用一个加载页面把你引到另一个页面上,但是网页的 URL 链接在这个过程中一直没有变化。
- クローラーによって収集された Web ページのコンテンツがブラウザーに表示されるものと異なる場合、それはクローラーが JavaScript コードを実行できないが、ブラウザーは JavaScript を正しく実行できるためです。
- Python を使用して以下を使用するページをクロールする 2 つの方法ajax または dhtml 一方向:
- JavaScript コードからコンテンツを直接収集します
- サードパーティのライブラリを使用して JavaScript を実行し、ブラウザに表示されるページを直接収集します
Selenium
- Selenium はネットワーク データ収集ツールです
- Selenium は、Web サイトの自動テスト用に開発されており、ブラウザ上で直接実行できるため、ページを自動的にロードして必要なデータを取得できます。ページのスクリーンショットを撮ったり、Web サイト上で特定のアクションが発生したかどうかを判断したりすることもできます
- Selenium はサードパーティのブラウザーと組み合わせて使用する必要があります
- PhantomJS は Web サイトをメモリにロードしてページ上で JavaScript を実行できます。 Web ページはユーザーに表示されません。
- Selenium と PhantomJS を組み合わせると、Cookie、JavaScript、ヘッダー、その他必要なものすべてを処理できる非常に強力な Web クローラーを実行できます
- Python の Selenium ライブラリは次のとおりです。 WebDriver の呼び出し API を備えた webdriver は、Web サイトをロードするブラウザに似ており、BeautifulSoup オブジェクトのように使用して、ページ要素を検索したり、ページ上の要素と対話したり、クローラーを実行するためのその他のアクションを実行したりできます
- webdriver の page_source関数はページ文字列のソース コード文字を返します。 Selenium セレクターが必要ない場合は、返されたソース コードを使用して BeautifulSoup オブジェクトを作成できます。
ページの読み込み時間は、ページの読み込み時間の不確実性を解決する効果的な方法は、要素が存在するかどうかを Selenium に継続的にチェックさせて、ページが完全に読み込まれたかどうかを判断することです。 ページが正常に読み込まれた場合は、次の手順に従います。 -up プロシージャが実行されます。 -
WebDriverWait と Expected_conditions の組み合わせは Selenium の暗黙的な待機 (暗黙的な待機) を構成します -
暗黙的な待機と明示的な待機の違いは、暗黙的な待機は DOM 内で特定の状態が発生するまで待機してから続行することです。コードを実行します (明確な待機時間はありませんが、時間制限内であれば最大待機時間制限があります)。一方、明示的待機は待機時間を明示的に設定します。暗黙的な待機では、DOM トリガーの状態は Expected_conditions によって定義されます - Selenium でトリガーされる要素には、
を含む多くの期待条件があります - プロンプト ボックスがポップアップします
- 要素が選択されている (テキスト ボックスなど)
- ページのタイトルが変更される、または特定のテキストがページ上または要素に表示される
- 要素が DOM に表示される、または要素が DOM から消える
- 予期される条件のほとんどは、事前に指定する必要がありますTarget 要素を使用する場合、要素はロケーターで指定されます。
- ロケーターは By オブジェクトで表される抽象クエリ言語で、セレクター (driver.find_element(By.ID, "content") の作成など、さまざまな状況で使用できます。 ) )
- ロケーターなしでできる場合は、そうしないでください。結局のところ、インポートできるモジュールは 1 つ少なくなります
Xpath (XML Path) は、XML ドキュメント内の要素を移動および選択するためのクエリ言語です。BeautifulSoup は Xpath をサポートしません。使用方法は通常 CSS セレクターと同じです -
Xpath 構文の 4 つの重要な概念: -
ルート ノードと非ルート ノード-
/div は、ドキュメントのルート ノードである場合にのみ div ノードを選択します。 -
//div ドキュメント内のすべての div ノードを選択します (ルート以外のノードを含む)-
属性でノードを選択します-
//@href href 属性を持つすべてのノードを選択します-
//a[@href='http ://google.com'] ページ内のすべてのリンクを選択します Google サイトへのリンク-
位置でノードを選択-
//a[3] ドキュメント内の 3 番目のリンクを選択します-
//table[last() ] ドキュメント内の最後のテーブルを選択します-
//a [position()
*(アスタリスク) は任意の文字またはノードと一致し、さまざまな条件で使用できます -
//table/tr/* すべてのテーブル行を選択 tr タグのすべての子ノード (これは th タグと td タグの選択に適しています) -
//div[@*] 任意の属性を持つすべての div タグを選択します -
Microsoft の Xpath 構文ページ https://msdn .microsoft.com/en-us/enus/library/ms256471 -
リダイレクトの処理
クライアント側リダイレクトは、サーバーが送信する前にブラウザが JavaScript を実行することによって完成するページですサーバーによって完了したジャンプではなく、ページのコンテンツをブラウザーにジャンプします - クライアントのリダイレクトはリダイレクトです。つまり、サーバーは返された応答で要求されたリソースの正しい URL をクライアントに通知し、ステータスを設定します。コード 3xx。クライアントは、応答結果に基づいて新しい URL に応答します。 リクエストを開始します。
サーバー リダイレクトは、サーバーがリクエストを処理するプロセス中に処理のために他のコンポーネントに分散 (委任) するプロセスを指します。サーバーが内部的にどのように動作するかわかりませんし、知る必要もありません -
サーバーのリダイレクトは Python の urllib ライブラリで解決できます - JavaScript コードを実行してクライアントのリダイレクトの問題を解決するのに重要な点は、いつ行うかです。ページの監視を停止する方法の 1 つは、ページの読み込みが開始された時点から DOM 内の要素を「監視」し、Selenium が StaleElementReferenceException をスローするまで、つまり要素が DOM 内になくなるまでこの要素を繰り返し呼び出すことです。この時点でWebサイトがジャンプしたことを示すページが表示されます
-
第11章 画像認識とテキスト処理-
テキストをクロールされたくない場合 収集する場合、テキストを画像化して載せるのが一般的な方法ですウェブページ上で
Pillow を使用して画像の前処理を完了し、マシンが画像をより便利に読み取ることができるようにします
Tesseract は高精度の OCR ライブラリです柔軟性が高く、トレーニングを通じてあらゆるフォントと Unicode 文字を認識できます
- Tesseract は、tesseract コマンドを通じて Python の外部で実行される Python コマンドライン ツールです
- NumPy ライブラリには、線形代数と大規模科学計算が多数含まれています画像を数学的に巨大なピクセル配列に表現できるメソッド
-
整形式のテキストの処理-
整形式のテキストの特徴:
標準フォントを使用する (手書き、筆記体、または非常に「派手な」フォントは含まれていません)
- コピーまたは写真を撮ったものですが、フォントは非常に鮮明で、余分なマークや汚れはありません
きちんと配置され、曲がった言葉はありません -
写真の範囲を超えていない、または不完全ではなく、写真の端に貼り付いていることもありません-
識別が難しい画像の場合は、最初に画像を前処理することで画像からテキストへの変換の精度が大幅に向上します-
Tesseract の最大の欠点は、そのアルゴリズムが自動的に画像のコントラストを調整しようとするグラデーション背景色の処理であることです。ファイルを読み取る前に-
Selenium+Tesseract を使用して Web サイトの画像からテキストを取得します - 識別が難しい画像の場合、最初に画像を前処理すると、画像からテキストへの変換の精度が大幅に向上します-
- Tesseract に多数の既知のテキストと画像のマッピング セットを提供することにより、Tesseract はトレーニング後に同じフォントを認識することを「学習」し、非常に高い精度と精度を達成でき、テキストの背景色や色を無視することもできます。画像内の相対位置やその他の問題。
検証コードの読み取りと Tessract のトレーニング
- CAPTCHA (コンピュータと人間を区別するための完全に自動化されたパブリック チューリング テスト、コンピュータと人間を区別するための完全に自動化されたチューリング テスト)、検証コードと呼ばれ、その目的はネットワークを防ぐことです。アクセス
- テキストの種類を認識するように Tesseract をトレーニングするには、各文字のさまざまな形式のサンプルを提供する必要があります。
- 大量の検証コード サンプルをディレクトリにダウンロードします。サンプルの数は、複雑さによって決まります。 (検証コードを使用します。実際の結果は、各サンプル ファイルに名前を付けることです)
- 現時点では、いくつかの長方形の位置決めファイルは、画像内の各文字が何であるかを正確に伝える必要があります。を作成し、検証コード画像から四角形を生成します。 位置決めファイル(文字+文字を囲む最小の四角形の左下角と右上角の座標+画像サンプルの番号)(http://pp19dd.com/) tesseract-ocr-chopper/ オンライン変換ツール)
- 長方形の位置決めファイルは .box テキスト ファイルとして保存する必要があり、検証コードの実際の結果を示す名前も付けられます
- バックアップ
- 検証コード イメージと.box ファイルを使用してトレーニング ファイル (.tessdata ファイル) を作成します
確認コードの送信を取得する 回答
- ほとんどの Web サイトで生成される確認コード イメージには、次のプロパティがあります。
- これらは、サーバー側のプログラムによって動的に生成された画像です。認証コード画像のsrc属性は通常の画像と異なる場合がありますが、他の画像と同様にダウンロードして加工することができます。
- 写真に対する答えはサーバー側のデータベースに保存されます。
- 多くの確認コードには時間制限があり、あまりにも長く解決できなかった場合は無効になります。オンラインロボットの場合は問題ありませんが、認証コードの答えを後で使用できるように保存しておきたい場合や、何らかの方法で認証コードの有効期限を延長したい場合は、成功するのが難しい場合があります。
- 一般的な処理方法は、最初に検証コード画像をダウンロードしてクリーンアップし、次に Tesseract を使用して画像を処理し、最後に Web サイトの要件を満たす認識結果を返すことです。
第 12 章 スクレイピングトラップを避ける
倫理
- スクレイピングされたくない Web サイトをスクレイピングするには、非常に倫理的および法的な理由がある可能性があります
- ほとんどの Web ロボットは、最初はいくつかの広範な機能しか実行できません。
Web ロボットを人間のユーザーのように見せる
- Web サイトのフォームを処理することに加えて、リクエスト モジュールは、リクエスト ヘッダーを設定するための強力なツールでもあります
- すべてのネットワーク リクエスト メッセージを初期化するためにほとんどのブラウザで使用されるリクエスト。ヘッダーフィールド:
- ホスト: http://kissg.me
- 接続: keep-alive
- 受け入れ: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp
- User-エージェント: Mozilla/5.0 (Macintosh; Intel Mac OS gzip,deflate,sdch
- Accept-Language : en-US,en
-
- クラシック Python クローラーが urllib 標準ライブラリを使用する場合、Accept- のリクエストを送信します。 Encoding=identity;User-Agent=Python-urllib/3.4 Header
Web サイトは http リクエスト ヘッダーの各フィールドで「人間性」をチェックすることがありますが、最も重要なパラメーターは「User-Agent」です - Web サイトに警告を発するため、頻繁に注意する必要があります。 Accept-Language など、めったにチェックされないヘッダー フィールド
- リクエスト ヘッダーの違いにより、Web サイトでコンテンツのレイアウトが変更される可能性があります (User-Agent がヘッダーに設定されているなど)モバイル デバイスの Accpet-Language が別の言語に設定されている
- delete_cookie()、add_cookie()、および delete_all_cookies() メソッドを呼び出して Cookie を処理できます。さらに、他の Web クローラーで使用するために Cookie を保存することもできます
- クローラーをより人間らしく見せるために、遅延を増やす必要がある場合があります
- マルチスレッド クローラー。1 つのスレッドがデータを処理し、もう 1 つのスレッドがデータをロードします。データ (以前改善を考えていました クロール速度の方法はほぼ同じです)
一般的なフォームのセキュリティ対策
- HTML フォームでは、隠しフィールドにより、ブラウザーには表示されますが、ユーザーには表示されないフィールドが作成されることがあります。より多くの Web サイトが開始されます ユーザー ステータスを管理するために Cookie を使用して状態変数を保存します。別の最適な用途が見つかるまで、隠しフィールドは主にクローラーによるフォームの自動送信を防ぐために使用されます
- ネットワーク データの収集を防ぐために隠しフィールドを使用する 2 つの方法:
- Makeフォーム ページのフィールドは、サーバーによって生成されたランダム変数で表すことができます。解決策は、まずフォーム ページでこのランダム変数を収集し、それから他のフォーム データ
- ハニーポット (ハニー ポット) と一緒に意図的に送信することです。暗黙的なフィールドを設定すると、サーバーはこれらのフィールドの真の値を自動的に無視しますが、非表示のフィールドに入力するすべてのユーザーはブロックされる可能性があります。端的に言えば、これはクローラー用に意図的に設定されたフィールドです。
- If 隠しフィールドに大きなランダムな文字列変数がある場合、フォームの送信時に Web サーバーがそれらをチェックする可能性があります。生成されたフォーム変数は一度だけ使用されるか、最近生成されます
- HTML+CSS で要素を非表示にする方法:
- 単純な CSS 属性設定で非表示にする
- 非表示の入力フィールド
- ブラウザの境界を越えて要素の位置を設定し、スクロールバー
- Selenium は訪問したページのコンテンツを取得できるため、ページ上の表示要素と非表示要素を区別し、is_displayed() によってその要素がページ上に表示されているかどうかを判断できます。 3番目のメソッドは取り出すことができます!
- フォームを送信する前に、フォーム内で送信用の隠しフィールドの値を準備します(またはSeleniumに自動的に送信させます)
問題チェックリスト
- まず、 Web サーバーから受信したページが空白である場合、情報が欠落している場合、または不明な内容に遭遇した場合 それが期待どおりである場合 (またはブラウザーに表示されているものと異なる場合)、問題がある可能性があります。 Web サイト作成ページの JavaScript の実行
- Web サイトにフォームを送信する準備をしている場合、または POST リクエストを作成する準備をしている場合は、必ずページのコンテンツを確認して、「送信するすべてのフィールドが入力されていることを確認してください」を参照してください。正しい形式になっています。 Chrome ブラウザのネットワーク パネル (ショートカット キー f12 で開発者コンソールを開き、[ネットワーク] をクリックして表示) を使用して、Web サイトに送信された POST コマンドを表示し、各パラメータが正しいことを確認します。
- Web サイトにログインしているのにログインを維持できない場合、または Web サイトに他の「ログイン ステータス」の例外がある場合は、Cookie を確認してください。ページが読み込まれるたびに Cookie が正しく呼び出され、リクエストごとに Cookie がサイトに送信されていることを確認します。
- クライアントで HTTP エラー、特に 403 Forbidden エラーが発生した場合、Web サイトがこの IP をロボットとして扱い、リクエストを受け付けなくなったことを意味している可能性があります。 Web サイトのブラックリストから IP アドレスが削除されるまで待つか、ブロックされていないことが確実な場合は、次の内容を確認してください。
- Web サイト上のクローラーが特に高速ではないことを確認します。 急速な収集は悪い習慣であり、ネットワーク管理サーバーに大きな負担を与え、Web サイトによって IP がブラックリストに登録される主な原因となります。クローラーに遅延を追加して、真夜中に実行できるようにします。覚えておいてください: 急いでプログラムを書いたり、データを収集したりすることは、パニックを避けるために事前に計画を立てることが不十分であることを示しています。
- もう 1 つ行う必要があるのは、リクエスト ヘッダーを変更することです。Web サイトによっては、クローラーであると主張する訪問者をブロックします。適切なリクエスト ヘッダー値がわからない場合は、ブラウザのリクエスト ヘッダーを使用してください。
- 人間のユーザーが通常クリックまたはアクセスできない情報をクリックまたはアクセスしていないことを確認してください。
- Web サイトにアクセスするために多くの複雑な手段を使用した場合は、ネットワーク管理者に連絡して目的を伝えることを検討してください。 webmaster@ または admin@ に電子メールを送信して、クローラーの使用を許可するようネットワーク管理者にリクエストしてみてください。管理者も人間です
クローラーを使用して Web サイトをテストします
- 大規模なテクノロジー スタックを使用してネットワーク プロジェクトを開発する場合、多くの場合、スタックの一番下 (プロジェクトの後半で使用されるテクノロジー) でいくつかの定期テストのみを実行します。
- Web サイトは通常、さまざまなマークアップ言語とプログラミング言語が混在しているため、たとえ JavaScript 部分の単体テストを自動化することが困難になります。 JavaScript が対話する HTML コンテンツが変更された場合でも、JavaScript は正常に実行できます。また、Web ページに必要なアクションを完了することもできません
テストの概要
- 単体テストには通常、次の特徴が含まれます。コンポーネントのテストに使用されます。通常、コンポーネントのすべての単体テストは同じに統合されます。クラス内の各単体テストは、単体テストで必要なすべてのセットアップと分解を単体テストで処理する必要があります。他のテストに干渉することはできず、順序に関係なく、適切に動作する必要があります
- 各単体テストには通常、少なくとも 1 つのアサーションが含まれます
- 単体テストは製品コードから分離されますが、インポートしてコードで使用する必要があります。テストでは、通常、それらは別のクラスとディレクトリに保存されます。
-
Python単体テスト-
Pythonの単体テストモジュールunittestを最初にインポートしてからunittest.TestCaseクラスを継承する限り、以下を実現できます:
それぞれの開始と終了にsetUp関数とtearDown関数を提供します。単体テスト
- 提供 さまざまな種類のアサーション
- test_ で始まるすべての関数を単体テストとして実行し、test_ のない関数は無視します
-
- setUpClass 関数はクラスの初期化フェーズ中に 1 回だけ実行され、setUp 関数はクラスの初期化フェーズ中に 1 回だけ実行されますテストの開始 すべての実行
Selenium 単体テスト -
Selenium は、Web サイト上のさまざまな複雑な問題を解決できる優れたテスト フレームワークです。 本来の目的は、Web サイトのテストを行うことです
Selenium は、入力を含むブラウザ上で何でも実行できます。 、クリックなどすることで、異常なフォーム、JavaScript コードエラー、HTML レイアウトエラー、およびユーザーの使用中に発生する可能性のあるその他の問題を見つけることができます
- Selenium テストの鍵となるのは、特定の要素に対して多くの操作を実行できることです。要素 (例:
- myElement.click()
- myElement.click_and_hold()
- myElement.release()
- myElement.double_click()
- myElement.send_keys_to_element("content to enter"()
-
- 要素に対する複数の操作を一度に完了するには、アクション チェーンを使用して複数の操作を保存し、プログラム内で複数回実行できます
.drag_and_drop は、ログインの一部に使用できるドラッグ アンド ドロップを実装します検証 - driver.get_screenshot_as_file("xxx") のスクリーンショット
-
Python 単体テストと Selenium 単体テストのどちらかを選択-
Python の単体テスト構文は厳密で冗長であるため、ほとんどの大規模プロジェクトのテストを作成するのに適しています
Selenium のテスト方法は柔軟かつ強力で、一部の Web サイトの機能テストに使用できます。 第一候補
- Selenium を使用して Web サイトの情報を簡単に取得でき、単体テストでは情報がテスト条件を満たしているかどうかを評価できます。 この 2 つの組み合わせは、最高のパートナー
- Web サイトで見られるすべてのコンテンツは、Python 単体テストと Selenium Come テストと組み合わせることができます
-
第 14 章リモート収集 -
自分のラップトップで Python クローラーの実行をやめると、生活が楽になります
クローラー構築の第一原則: すべての情報はすべて偽装できるため、自分以外のメールボックスを使用して電子メールを送信し、コマンドを通じてマウスの動作を自動化できます
防止に重点を置いています。ウェブサイトの収集は、人間とロボットの動作の違いを特定することに主に焦点を当てています
オニオン ルーティング (オニオン ルーター) ネットワークは、IP アドレス匿名性の手段です。複数の層が異なるサーバーによって (玉ねぎのように) 形成され、クライアントは最も内側の層でラップされます。データはネットワークに入る前に暗号化されるため、サーバーが通信データを盗むことはできません
Tor ネットワークでは、Web サイトにアクセスするときに IP アドレスを表示できますが、これは追跡できない IP アドレスですが、ウェブサイト上のサーバーに任せてください。あらゆる情報はあなたの身元を明らかにします。
- Tor ネットワークへのログインは、自動的に匿名化されるものではなく、インターネットのどの領域にもアクセスできるようにするものでもありません。実用的なツールではありますが、使用する際は慎重かつ冷静かつ倫理的に行う必要があります
- Tor を使用するとネットワーク速度が遅くなります。これは、プロキシが宛先に到達するまでに世界中のネットワークを何度も移動する必要があるためです。
- Tor サービスはポート 9150 で実行する必要があります
- PySocks は、Tor と組み合わせて使用できるプロキシ サーバー通信モジュールです
- tor Selenium と phantomjs を使用する場合、pysocks は必要ありません。tor が実行されていることを確認してから、service_args パラメーターを追加してプロキシ ポートを設定し、Selenium がポート 9150 経由で Web サイトに接続できるようにします。不親切なユーザー インターフェイスを備えたスーパー API
Python の Zen
明示的なものは、複雑なものよりも優れています。可読性は、ルールを破るほど特別なものではありませんが、明確に黙らせない限り、エラーは無視されるべきです。オランダ人でない限り、最初はその方法が明らかではないかもしれませんが、実装を説明するのが難しい場合は、今よりも良い方法が得られることがよくあります。悪いアイデアです。説明するのは簡単ですが、良いアイデアかもしれません。名前空間は、素晴らしいアイデアの 1 つです。これらをもっと実行しましょう。
美しいほうが、醜いよりも優れています。 明確な方が、複雑であるよりも優れています。乱雑であるよりも複雑な方が優れています 入れ子になっているよりも緩いことが重要です 例外があっても読みやすさが重要です 現実は完璧ではないことがよくありますが、例外を無視すべきではありません。複数の可能性がある場合は、それが唯一の解決策であると考えないでください。ただし、Python 1 の父ではないため、それが最善の解決策です。やらないよりは良いですが、何も考えずに実行する方が、実行しないよりは悪いです。 解決策が理解しにくい場合、それは良い解決策ではありません。名前空間は非常に便利なので、もっと活用する必要があります
インターネットの概要
インターネットは情報交換の一種です
http がデータ パッケージを受信するとき、データ パッケージの内容は次のようにみなされる必要があります。ウェブサイト、そしてウェブサイトの構造は html で構成されています
html は通常プログラミング言語とみなされますが、実際にはマークアップ言語であり、各要素を識別するためのタグを通じてドキュメントやその他の構造を定義します -
css はHTML と連携して Web サイトのスタイルを定義する言語です-
- Web サイトのオブジェクトの色、位置、サイズ、背景などの属性を定義します
-
ネットワークデータ収集に対する法的および道徳的制約
知的財産権は 3 つの基本的なタイプに分類されます。 (^TM または ®)、著作権 (©)、特許.
- 特許は、コンテンツの所有権が発明者にのみ帰属することを宣言するために使用されます
- 商標は、出典を特定し区別するために使用される単語、語句、記号、またはデザインです商標の所有権は主に使用シナリオによって決まります
- 何かが世に出される限り、自動的に著作権法によって保護されます
著作権の保護には統計や事実ではなく、創造的な作品のみが含まれます。クローラーが収集するのは事実と統計データです。データが事実情報である場合、それを完全にコピーしても著作権法に違反しません-
以下の条件が満たされる場合、クローラーは動産の侵害とみなされます。ウェブサイトのサービス契約の条件が明確な場合 -
実害を引き起こすクローラーの使用は禁止されています - 意図的に行われた場合 - -
-
- 3 つの条件が満たされた場合にのみ、動産の侵害とみなされます。 (実際、Wikipedia で見つけました!)
- robots.txt ファイルはプログラムで簡単に使用できます 解析して使用するための、rebots.txt ファイルの構文の標準形式はありません。これは業界では一般的な慣行です。
robots.txt のコメントされていない最初の行は、どのロボットがルールに従う必要があるかを示します。一連のルール「Allow:」または「Disallow:」を使用して、ロボットが Web サイトのこの部分にアクセスできるようにするかどうかを決定します。ルールに矛盾するルールが続く場合、後者のルールが実行されます。 - Google クローラーが Web サイトを収集する場合、 Web サイトのコピーを残してインターネット上に置き、誰でもキャッシュにアクセスできるようにします。