Современный скрапинг веб-сайтов с помощью Python. 2-е межд. издание
Если программирование напоминает волшебство, то веб-скрапинг — это очень сильное колдунство. Написав простую автоматизированную программу, можно отправлять запросы на веб-серверы, запрашивать с них данные, а затем анализировать их и извлекать необходимую информацию. Новое расширенное издание книги знакомит не только с веб-скрапингом, но и поможет собрать любого вида данные в современном Интернете.
В части I основное внимание уделено механике веб-скрапинга: как с помощью Python запрашивать информацию с веб-сервера, производить базовую обработку серверного отклика и организовать автоматизированное взаимодействие с сайтами. В части II исследованы более специфичные инструменты и приложения, которые пригодятся при любом сценарии веб-скрапинга.
- Разбирайте сложные HTML-страницы.
- Разрабатывайте поисковые роботы с помощью фреймворка Scrapy.
- Изучайте методы хранения данных, полученных с помощью скрапинга.
- Считывайте и извлекайте данные из документов.
- Очищайте и нормализуйте плохо отформатированные данные.
- Читайте и пишите информацию на естественных языках.
- Освойте поиск по формам и логинам.
- Изучите скрапинг JavaScript и работу с API.
- Используйте и пишите программы для преобразования изображений в текст.
- Учитесь обходить скрапинговые ловушки и блокаторы ботов.
- Протестируйте собственный сайт с помощью скрапинга.
В части I основное внимание уделено механике веб-скрапинга: как с помощью Python запрашивать информацию с веб-сервера, производить базовую обработку серверного отклика и организовать автоматизированное взаимодействие с сайтами. В части II исследованы более специфичные инструменты и приложения, которые пригодятся при любом сценарии веб-скрапинга.
- Разбирайте сложные HTML-страницы.
- Разрабатывайте поисковые роботы с помощью фреймворка Scrapy.
- Изучайте методы хранения данных, полученных с помощью скрапинга.
- Считывайте и извлекайте данные из документов.
- Очищайте и нормализуйте плохо отформатированные данные.
- Читайте и пишите информацию на естественных языках.
- Освойте поиск по формам и логинам.
- Изучите скрапинг JavaScript и работу с API.
- Используйте и пишите программы для преобразования изображений в текст.
- Учитесь обходить скрапинговые ловушки и блокаторы ботов.
- Протестируйте собственный сайт с помощью скрапинга.
Дәйексөздер121
else:
internalLinks.append(link.attrs['href'])
return internalLinks
# Получить список всех внешних ссылок, найденных на странице.
def getExternalLinks(bs, excludeUrl):
externalLinks = []
# Найти все ссылки, которые начинаются с "http" или "www",
# не содержащие текущий URL.
for link in bs.find_all('a',
href=re.compile('^(http|www)((?!'+excludeUrl+').)*$')):
if link.attrs['href'] is not None:
if link.attrs['href'] not in externalLinks:
externalLinks.append(link.attrs['href'])
return externalLinks
def getRandomExternalLink(startingPage):
html = urlopen(startingPage)
bs = BeautifulSoup(html, 'html.parser')
externalLinks = getExternalLinks(bs,
urlparse(startingPage).netloc)
if len(externalLinks) == 0:
print('No external links, looking around the site for one')
domain = '{}://{}'.format(urlparse(startingPage).scheme,
urlparse(startingPage).netloc)
internalLinks = getInternalLinks(bs, domain)
return getRandomExternalLink(internalLinks[random.randint(0,
len(internalLinks)-1)])
else:
return externalLinks[random.randint(0, len(externalLinks)-1)]
def followExternalOnly(startingSite):
externalLink = getRandomExternalLink(startingSite)
print('Random external link is: {}'.format(externalLink))
followExternalOnly(externalLink)
followExternalOnly('http://oreilly.com')
internalLinks.append(link.attrs['href'])
return internalLinks
# Получить список всех внешних ссылок, найденных на странице.
def getExternalLinks(bs, excludeUrl):
externalLinks = []
# Найти все ссылки, которые начинаются с "http" или "www",
# не содержащие текущий URL.
for link in bs.find_all('a',
href=re.compile('^(http|www)((?!'+excludeUrl+').)*$')):
if link.attrs['href'] is not None:
if link.attrs['href'] not in externalLinks:
externalLinks.append(link.attrs['href'])
return externalLinks
def getRandomExternalLink(startingPage):
html = urlopen(startingPage)
bs = BeautifulSoup(html, 'html.parser')
externalLinks = getExternalLinks(bs,
urlparse(startingPage).netloc)
if len(externalLinks) == 0:
print('No external links, looking around the site for one')
domain = '{}://{}'.format(urlparse(startingPage).scheme,
urlparse(startingPage).netloc)
internalLinks = getInternalLinks(bs, domain)
return getRandomExternalLink(internalLinks[random.randint(0,
len(internalLinks)-1)])
else:
return externalLinks[random.randint(0, len(externalLinks)-1)]
def followExternalOnly(startingSite):
externalLink = getRandomExternalLink(startingSite)
print('Random external link is: {}'.format(externalLink))
followExternalOnly(externalLink)
followExternalOnly('http://oreilly.com')
from urllib.request import urlopen
from urllib.parse import urlparse
from bs4 import BeautifulSoup
import re
import datetime
import random
pages = set()
random.seed(datetime.datetime.now())
# Получить список всех внутренних ссылок, найденных на странице.
def getInternalLinks(bs, includeUrl):
includeUrl = '{}://{}'.format(urlparse(includeUrl).scheme,
urlparse(includeUrl).netloc)
internalLinks = []
# найти все ссылки, которые начинаются с "/"
for link in bs.find_all('a',
href=re.compile('^(/|.*'+includeUrl+')')):
if link.attrs['href'] is not None:
if link.attrs['href'] not in internalLinks:
if(link.attrs['href'].startswith('/')):
internalLinks.append(
includeUrl+link.attrs['href'])
from urllib.parse import urlparse
from bs4 import BeautifulSoup
import re
import datetime
import random
pages = set()
random.seed(datetime.datetime.now())
# Получить список всех внутренних ссылок, найденных на странице.
def getInternalLinks(bs, includeUrl):
includeUrl = '{}://{}'.format(urlparse(includeUrl).scheme,
urlparse(includeUrl).netloc)
internalLinks = []
# найти все ссылки, которые начинаются с "/"
for link in bs.find_all('a',
href=re.compile('^(/|.*'+includeUrl+')')):
if link.attrs['href'] is not None:
if link.attrs['href'] not in internalLinks:
if(link.attrs['href'].startswith('/')):
internalLinks.append(
includeUrl+link.attrs['href'])
Принимая решение о том, какие данные собирать, зачастую лучше игнорировать сайты. Нельзя запустить проект, рассчитанный на то, чтобы стать большим и масштабируемым, посмотрев только на один сайт и спросив себя: «Что здесь есть?» Вместо этого нужно задать другой вопрос: «Что мне нужно?» — а затем найти способы поиска необходимой информации.
Сөреде18
1 829 кітап
808
277 кітап
760
58 кітап
60
100 кітап
39
148 кітап
38
