Простое упражнение с поисковым роботом с использованием запросов + BeautifulSoup

задняя часть Python рептилия регулярное выражение

Это 17-я оригинальная статья о ежедневном изучении Python.

После разговора о библиотеке BeautifulSoup в последней статье, в этой статье мы используем знания из предыдущей статьи для сканирования нашего тематического веб-сайта сегодня:100 лучших фильмов «Кошачий глаз».Этот веб-сайт также очень прост, поэтому вы можете сначала просканировать его самостоятельно, а затем просмотреть эту статью, когда столкнетесь с проблемами.

Эта статья в основном для практики, она бесполезна, пожалуйста, в обход!

1. Библиотеки и веб-сайты, используемые в этой статье

  • requests

  • BeautifulSoup

  • Целевой сайт: http://maoyan.com/board/4

2. Проанализируйте целевой сайт


Нужную информацию легко найти. 5 стрелок выше - это вся необходимая информация, а именно адрес изображения фильма, название фильма, игра в главных ролях, время показа и рейтинг. Контент есть, следующий шаг — получить ссылку на следующую страницу.

image.png

Здесь есть два метода: первый — получить ссылки всех страниц на главной странице, а второй — получить ссылки на следующую страницу каждой страницы. Здесь, поскольку даны ссылки только на некоторые страницы, мы получаем ссылки на следующую страницу, что более удобно.


Что ж, анализ завершен, а затем накатывается код.

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)


Выходной результат:

image.png

Удивлен или нет, удивлен или нет? Если вы часто играете с рептилиями, это неудивительно, мы были против ползания. Попробуем добавить заголовок запроса.

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 каждый день

Код — это не только баги, но и красота и веселье