Kodomo

Пользователь

Краулеры

   1 >>> import urllib.request
   2 >>> x = urllib.request.urlopen("http://yandex.ru")
   3 >>> text = x.read()
   4 >>> text[:100]
   5 b'<!DOCTYPE html><html class="i-ua_js_no i-ua_css_standart i-ua_browser_" lang="ru"><head xmlns:og="ht'

   1 >>> x = urllib.request.urlopen("http://yandex.ru/yandsearch?text=hello")
   2 >>> text = x.read()
   3 >>> text[:100]
   4 b'<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtm'

   1 >>> x = urllib.request.urlopen("http://yandex.ru/yandsearch?text=hello")
   2 >>> yatext = x.read()
   3 >>> rutext = yatext.decode("utf-8")

   1 >>> import re
   2 >>> re.sub('<[^>]*>', '', rutext)
   3 '\n\n\n\n  \n  \n  \n  \n  \n  \n  \n  \n  \n  -->\n\n  \n  function Focus() {\n      document.getElementById("rep").focus();\n  }\n  \n\n  \n  function ShowText() {\n      var d = document.getElementById("id_captcha_text");\n      d.style.display = (d.style.display == \'block\') ? \'\' : \'block\';\n  }\n  \n  Ой!\n\n\n\n\n\n  \n  \n  \n    \n      \n\n      \n        \n          \n            \n          \n        \n      \n\n      \n\n      \n        \n          \n            &nbsp;\n          \n        \n\n        \n          ой...\n        \n\n        \n          \n            \n              \n            \n          \n        \n      \n\n      \n\n      \n        \n          \n            \n          \n\n          \n            \n          \n\n          \n            \n          \n\n          \n            \n          \n        \n      \n\n      \n    \n    \n  \n  \n  \n  \n    \n      \n\n      \n\n      \n        \n          \nНам очень жаль, но запросы, поступившие с вашего IP-адреса, похожи на автоматические.\nПо этой причине мы вынуждены временно заблокировать доступ к поиску.\nЧтобы продолжить поиск, пожалуйста, введите символы с картинки в поле ввода и нажмите «Отправить».\n\n          \n          \n          \n          \n\n          \n    \n    \n        \n        \n        \n    \n    \n\n\n            \n            \n             \n  \n                \n                \n             \n  \n  \n    \n      \n        \n        \n        \n            \n            Показать другую картинку\n        \n        \n        \n          \n          \n        \n      \n      \n                        В вашем браузере отключены файлы cookies. Яндекс не сможет запомнить вас и правильно идентифицировать в дальнейшем. Чтобы включить cookies, воспользуйтесь советами на странице нашей Помощи.             \n      \n    \n  \n  \n\n            \n            \n          \n\nПочему так случилось?\n\n\n    Возможно, автоматические запросы принадлежат не вам, а другому пользователю, выходящему в сеть с одного с вами IP-адреса.\n    Вам необходимо один раз ввести символы в форму, после чего мы запомним вас и сможем отличать от других пользователей, выходящих с данного IP.\n    В этом случае страница с капчей не будет беспокоить вас довольно долго.\n    Возможно, в вашем браузере установлены дополнения, которые могут задавать автоматические запросы к поиску. В этом случае рекомендуем вам отключить их.\n    Также возможно, что ваш компьютер заражен вирусной программой, использующей его для сбора информации.\n    Может быть, вам стоит проверить систему на наличие вирусов, например, антивирусной утилитой CureIt от «Dr.Web». \n    Если у вас возникли проблемы или вы хотите задать вопрос нашей службе поддержки, пожалуйста, воспользуйтесь\n    формой обратной связи.\n    \n\n\n\n  \n    Если автоматические запросы действительно поступают с вашего компьютера, и вы об этом знаете (например, вам по роду деятельности необходимо отправлять Яндексу\n    подобные запросы), рекомендуем воспользоваться специально разработанным для этих целей сервисом\n    Яндекс.XML.\n\n\n\n        \n      \n\n      \n\n      \n\n      \n    \n  \n  \n  \n  \n    \n    \n      \n        \n\n        \n\n        \n          \n              Обратная&nbsp;связь\n          \n        \n\n        \n          \n              ©&nbsp;1997—2014 «Яндекс»\n          \n        \n\n        \n      \n    \n  \n  \n  \n  \n(function (d, w, c) { (w[c] = w[c] || []).push(function() { try { w.yaCounter10630330 = new Ya.Metrika({id:10630330, webvisor:true, clickmap:true, trackLinks:true, accurateTrackBounce:true, ut:"noindex"}); } catch(e) { } }); var n = d.getElementsByTagName("script")[0], s = d.createElement("script"), f = function () { n.parentNode.insertBefore(s, n); }; s.type = "text/javascript"; s.async = true; s.src = (d.location.protocol == "https:" ? "https:" : "http:") + "//mc.yandex.ru/metrika/watch.js"; if (w.opera == "[object Opera]") { d.addEventListener("DOMContentLoaded", f, false); } else { f(); } })(document, window, "yandex_metrika_callbacks");\n\n  \n\n\n\n'

   1 >>> noscript = re.sub('<script[^<]*</script>', '', rutext)
   2 >>> clean = re.sub('<[^>]*>', '', noscript)
   3 >>> re.sub('\s+', ' ', clean)
   4 ' --> Ой! &nbsp; ой... Нам очень жаль, но запросы, поступившие с вашего IP-адреса, похожи на автоматические. По этой причине мы вынуждены временно заблокировать доступ к поиску. Чтобы продолжить поиск, пожалуйста, введите символы с картинки в поле ввода и нажмите «Отправить». Показать другую картинку В вашем браузере отключены файлы cookies. Яндекс не сможет запомнить вас и правильно идентифицировать в дальнейшем. Чтобы включить cookies, воспользуйтесь советами на странице нашей Помощи. Почему так случилось? Возможно, автоматические запросы принадлежат не вам, а другому пользователю, выходящему в сеть с одного с вами IP-адреса. Вам необходимо один раз ввести символы в форму, после чего мы запомним вас и сможем отличать от других пользователей, выходящих с данного IP. В этом случае страница с капчей не будет беспокоить вас довольно долго. Возможно, в вашем браузере установлены дополнения, которые могут задавать автоматические запросы к поиску. В этом случае рекомендуем вам отключить их. Также возможно, что ваш компьютер заражен вирусной программой, использующей его для сбора информации. Может быть, вам стоит проверить систему на наличие вирусов, например, антивирусной утилитой CureIt от «Dr.Web». Если у вас возникли проблемы или вы хотите задать вопрос нашей службе поддержки, пожалуйста, воспользуйтесь формой обратной связи. Если автоматические запросы действительно поступают с вашего компьютера, и вы об этом знаете (например, вам по роду деятельности необходимо отправлять Яндексу подобные запросы), рекомендуем воспользоваться специально разработанным для этих целей сервисом Яндекс.XML. Обратная&nbsp;связь ©&nbsp;1997—2014 «Яндекс» '

robots.txt

   1 >>> import urllib.robotparser
   2 >>> p = urllib.robotparser.RobotFileParser('http://yandex.ru')
   3 >>> p.can_fetch('urllib', 'http://yandex.ru/yandsearch?text=hello')
   4 True

   1 >>> p = urllib.robotparser.RobotFileParser('http://yandex.ru/robots.txt')
   2 >>> p.can_fetch('urllib', 'http://yandex.ru/yandsearch?text=hello')
   3 True

   1 >>> p = urllib.robotparser.RobotFileParser('http://yandex.ru/robots.txt')
   2 >>> p.read()
   3 >>> p.can_fetch('urllib', 'http://yandex.ru/yandsearch?text=hello')
   4 False
   5 >>> p.can_fetch('urllib', 'http://yandex.ru/yac2014/')
   6 True

Главный цикл

   1 urls = ['http://newsru.com']
   2 for url in urls:
   3     # fetch page
   4     # find all urls in page
   5     #   avoid uninteresting links
   6     #   avoid links we've already seen
   7     # add new urls to our list

   1 from urllib.request import urlopen
   2 import re
   3 
   4 urls = ['http://newsru.com']
   5 for url in urls:
   6     print(url)
   7     # fetch page
   8     file = urlopen(url)
   9     text = file.read()
  10 
  11     # find all urls in page
  12     #   avoid uninteresting links
  13     #   avoid links we've already seen
  14     # add new urls to our list

   1 from urllib.request import urlopen
   2 import re
   3 
   4 urls = ['http://newsru.com']
   5 for url in urls:
   6     print(url)
   7     # fetch page
   8     file = urlopen(url)
   9     text = file.read()
  10     if 'charset' in file.headers['content-type']:
  11         charset, = re.findall('charset=(.*)',
  12             file.headers['content-type'])
  13     elif b'charset=cp1251' in text:
  14         charset = 'windows-1251'
  15     elif b'charset=windows-1251' in text:
  16         charset = 'windows-1251'
  17     elif b'charset=utf-8' in text:
  18         charset = 'utf-8'
  19     text = text.decode(charset)
  20 
  21     # find all urls in page
  22     #   avoid uninteresting links
  23     #   avoid links we've already seen
  24     # add new urls to our list

   1 from urllib.request import urlopen
   2 import re
   3 
   4 domain = 'http://newsru.com'
   5 urls = ['http://newsru.com']
   6 for url in urls:
   7     print(url)
   8     # fetch page
   9     file = urlopen(url)
  10     text = file.read()
  11     if 'charset' in file.headers['content-type']:
  12         charset, = re.findall('charset=(.*)',
  13             file.headers['content-type'])
  14     elif b'charset=cp1251' in text:
  15         charset = 'windows-1251'
  16     elif b'charset=windows-1251' in text:
  17         charset = 'windows-1251'
  18     elif b'charset=utf-8' in text:
  19         charset = 'utf-8'
  20     text = text.decode(charset)
  21 
  22     # find all urls in page
  23     for link in re.findall('href=["\']([^"\']*)["\']',
  24                            text):
  25         if link.startswith("/"):
  26             link = domain + link
  27     #   avoid uninteresting links
  28         if link.startswith("http://"):
  29             continue
  30         if link.startswith("https://"):
  31             continue            
  32     #   avoid links we've already seen
  33         if link in urls:
  34             continue
  35     # add new urls to our list
  36         urls.append(link)

   1 from urllib.request import urlopen
   2 from urllib.robotparser import RobotFileParser
   3 import re
   4 
   5 domain = 'http://newsru.com'
   6 urls = ['http://newsru.com']
   7 robots = RobotFileParser(domain + '/robots.txt')
   8 robots.read()
   9 for url in urls:
  10     print(url)
  11     # fetch page
  12     # if we may
  13     if not robots.can_fetch('urllib', url):
  14         print('denied')
  15         continue
  16     file = urlopen(url)
  17     text = file.read()
  18     if 'charset' in file.headers['content-type']:
  19         charset, = re.findall('charset=(.*)',
  20             file.headers['content-type'])
  21     elif b'charset=cp1251' in text:
  22         charset = 'windows-1251'
  23     elif b'charset=windows-1251' in text:
  24         charset = 'windows-1251'
  25     elif b'charset=utf-8' in text:
  26         charset = 'utf-8'
  27     text = text.decode(charset)
  28 
  29     # find all urls in page
  30     for link in re.findall('href=["\']([^"\']*)["\']',
  31                            text):
  32     #   avoid uninteresting links
  33         if link.startswith("http://"):
  34             continue
  35         if link.startswith("https://"):
  36             continue
  37     #   but still parse the interesting ones
  38         if link.startswith("/"):
  39             link = domain + link
  40         if link.startswith('#'):
  41             continue
  42     #   avoid links we've already seen
  43         if link in urls:
  44             continue
  45     # add new urls to our list
  46         urls.append(link)

   1 from urllib.request import urlopen
   2 from urllib.robotparser import RobotFileParser
   3 import re
   4 
   5 domain = 'http://newsru.com'
   6 urls = ['http://newsru.com']
   7 
   8 def fetch_page(url):
   9     file = urlopen(url)
  10     text = file.read()
  11     charset = detect_charset(file, text)
  12     retun text.decode(charset)
  13 
  14 def detect_charset(file, text):
  15     if 'charset' in file.headers['content-type']:
  16         return re.findall('charset=(.*)', file.headers['content-type'])[0]
  17     elif b'charset=cp1251' in text:
  18         return 'windows-1251'
  19     elif b'charset=windows-1251' in text:
  20         return 'windows-1251'
  21     elif b'charset=utf-8' in text:
  22         return 'utf-8'
  23 
  24 def add_new_links(text, urls):
  25     for link in re.findall('href=["\']([^"\']*)["\']', text):
  26       if is_boring_link(link):
  27         continue
  28       link = normalize_link(link)
  29       if link in urls:
  30           continue
  31       urls.append(link)
  32 
  33 def normalize_link(link):
  34     if link.startswith("/"):
  35         return domain + link
  36     elif '://' in link:
  37         return link
  38     # else ...
  39 
  40 def is_boring_link(link):
  41     if link.startswith("http://"):
  42         return True
  43     if link.startswith("https://"):
  44         return True
  45     if link.startswith('#'):
  46         return True
  47 
  48 robots = RobotFileParser(domain + '/robots.txt')
  49 robots.read()
  50 for url in urls:
  51     if not robots.can_fetch('urllib', url):
  52         print(url)
  53         text = fetch_page(url)
  54         add_new_links(text, urls)
  55     else:
  56         print(url, 'denied')