Это 17-я оригинальная статья о ежедневном изучении Python.
После разговора о библиотеке BeautifulSoup в последней статье, в этой статье мы используем знания из предыдущей статьи для сканирования нашего тематического веб-сайта сегодня:100 лучших фильмов «Кошачий глаз».Этот веб-сайт также очень прост, поэтому вы можете сначала просканировать его самостоятельно, а затем просмотреть эту статью, когда столкнетесь с проблемами.
Эта статья в основном для практики, она бесполезна, пожалуйста, в обход!
1. Библиотеки и веб-сайты, используемые в этой статье
requests
BeautifulSoup
Целевой сайт: http://maoyan.com/board/4
2. Проанализируйте целевой сайт
Нужную информацию легко найти. 5 стрелок выше - это вся необходимая информация, а именно адрес изображения фильма, название фильма, игра в главных ролях, время показа и рейтинг. Контент есть, следующий шаг — получить ссылку на следующую страницу.
Здесь есть два метода: первый — получить ссылки всех страниц на главной странице, а второй — получить ссылки на следующую страницу каждой страницы. Здесь, поскольку даны ссылки только на некоторые страницы, мы получаем ссылки на следующую страницу, что более удобно.
Что ж, анализ завершен, а затем накатывается код.
3. Введите код
Несмотря ни на что, сделайте запрос на получение немедленно
import requests
from bs4 import BeautifulSoup
url_start = 'http://maoyan.com/board/4'
response = requests.get(url_start)
if response.status_code == 200:
soup = BeautifulSoup(response.text, 'lxml')
print(response.text)
Выходной результат:
Удивлен или нет, удивлен или нет? Если вы часто играете с рептилиями, это неудивительно, мы были против ползания. Попробуем добавить заголовок запроса.
url_start = 'http://maoyan.com/board/4'
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36'}
response = requests.get(url_start, headers=headers)
Таким образом, вы можете вернуться в обычном режиме, потому что большинство веб-сайтов добавят антисканирование в заголовок запроса, поэтому не беспокойтесь, если вы столкнетесь с антисканированием, попробуйте добавить заголовок запроса?
Затем используйте BeautifulSoupL, чтобы получить контент
imgs = soup.select('dd .board-img') # 这是获取图片链接
titles = soup.select('dd .board-item-main .name') # 这是获取电影名字
starses = soup.select('dd .board-item-main .movie-item-info .star') # 这是获取电影主演
times = soup.select('dd .board-item-main .movie-item-info .releasetime') # 这是获取电影上映时间
scores = soup.select('dd .board-item-main .score-num') # 这是获取评分
Каждое из полученных здесь предложений содержит информацию о каждом отдельном фильме, поэтому невозможно поместить информацию о каждом фильме в один и тот же персонаж одновременно, как обычно. Например, фотографии, которые я получил, оператор получает ссылки на все изображения фильмов на этой странице, и нам нужно их удалить, когда мы их сохраняем. Здесь я использую цикл for от 0 до 9 для сохранения одной и той же информации о координатах в том же словаре.
films = [] # 存储一个页面的所有电影信息
for x in range(0, 10):
# 这个是获取属性的链接
img = imgs[x]['data-src']
# 下面的都是获取标签的内容并去掉两端空格
title = titles[x].get_text().strip()
stars = starses[x].get_text().strip()[3:] # 使用切片是去掉主演二字
time = times[x].get_text().strip()[5:] # 使用切片是去掉上映时间二字
score = scores[x].get_text().strip()
film = {'title': title, 'img': img, 'stars': stars, 'time': time, 'score': score}
films.append(film)
Следующим шагом будет получение ссылки для каждой страницы.
pages = soup.select('.list-pager li a') # 可以看到下一页的链接在最后一个a标签
page = pages[len(pages)-1]['href']
Последнее просто, просто используйте цикл, чтобы удалить содержимое всех страниц, и код не будет опубликован.
напиши в конце
Это небольшое упражнение библиотеки BeautifulSoup. Вчера я не использовал большую часть содержимого, но я использовал только часть селектора и часть получения текстового содержимого и атрибутов. Я чувствую, что лучше использовать регуляризацию. Я могу получить подробную информацию о каждом фильме с регуляризацией. Содержание выглядит следующим образом:
<dd>.*?board-index.*?>([\d]{1,3})</i>.*?title="(.*?)".*?class="star">(.*?)</p>.*?class="releasetime">(.*?)</p>.*?class="integer">(.*?)</i>.*?class="fraction">(.*?)</i>
Вам также необходимо использовать соответствующий шаблон:re.SВот и все. Поэтому я рекомендую использовать регулярные выражения.
Если вам нужен полный код, пожалуйста, проверьте мой github!
гитхаб:GitHub.com/Серхио Джун/…
Если эта статья вам полезна, как насчет лайка и ретвита?
БОЛЬШЕРасширенное чтение◐◑Просканируйте книгу «Автостопом по Python!» и создайте PDF-файл.
◐◑ Подробное объяснение BeautifulSoup, общей библиотеки для поисковых роботов Python.
◐◑ Старый драйвер заставит вас использовать python для сканирования изображения девушки.
Изучайте Python каждый день
Код — это не только баги, но и красота и веселье