Краулеры
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 \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 Обратная связь\n \n \n\n \n \n © 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 ' --> Ой! ой... Нам очень жаль, но запросы, поступившие с вашего IP-адреса, похожи на автоматические. По этой причине мы вынуждены временно заблокировать доступ к поиску. Чтобы продолжить поиск, пожалуйста, введите символы с картинки в поле ввода и нажмите «Отправить». Показать другую картинку В вашем браузере отключены файлы cookies. Яндекс не сможет запомнить вас и правильно идентифицировать в дальнейшем. Чтобы включить cookies, воспользуйтесь советами на странице нашей Помощи. Почему так случилось? Возможно, автоматические запросы принадлежат не вам, а другому пользователю, выходящему в сеть с одного с вами IP-адреса. Вам необходимо один раз ввести символы в форму, после чего мы запомним вас и сможем отличать от других пользователей, выходящих с данного IP. В этом случае страница с капчей не будет беспокоить вас довольно долго. Возможно, в вашем браузере установлены дополнения, которые могут задавать автоматические запросы к поиску. В этом случае рекомендуем вам отключить их. Также возможно, что ваш компьютер заражен вирусной программой, использующей его для сбора информации. Может быть, вам стоит проверить систему на наличие вирусов, например, антивирусной утилитой CureIt от «Dr.Web». Если у вас возникли проблемы или вы хотите задать вопрос нашей службе поддержки, пожалуйста, воспользуйтесь формой обратной связи. Если автоматические запросы действительно поступают с вашего компьютера, и вы об этом знаете (например, вам по роду деятельности необходимо отправлять Яндексу подобные запросы), рекомендуем воспользоваться специально разработанным для этих целей сервисом Яндекс.XML. Обратная связь © 1997—2014 «Яндекс» '
robots.txt
Главный цикл
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')