1. from project.items import Post
2. from project.common.regexp_template import RegExp
3. from project.settings import SPIDER_URLS
4. from datetime import datetime
5. import scrapy
6. import re
7.
8.
9. class BankiruSpider(scrapy.Spider):
10. # Обязательные переменных класса
11. # Имя парсера, должно быть уникальным по всему проекту
12. name = "bankiru"
13.
14. # Список URL с которых будет начинаться парсинг
15. start_urls = SPIDER_URLS[name]
16.
17. def __init__(self, *args, **kwargs):
18. super().__init__(*args, **kwargs)
19. self.limit_date = kwargs.get("limit_date", None)
20. self.completed = False
21.
22. # Основной метод парсера запускающий разбор страниц
23. def parse(self, response):
24. # Получаем все теги постов (сообщений) на текущей странице сайта
25. main = response.css("main.layout-column-center")
26. posts = main.css("table.resptab")
27.
28. for post in posts:
29. post_link = re.sub(r"#.+$", "", post.css("a.linkNote::attr(href)").get())
30. # Выполнение парсинга поста в методе self.parse_post
31. yield response.follow(f"{post_link}/", self.parse_post)
32. # Условие для остановки парсинга - достижение поста с определенной датой
33. if self.completed:
34. break
35.
36. # Поиск и формирование ссылки для вледующей страницы сайта
37. current_page = response.url.split("/")[-1]
38. lst_url = current_page.split("=")
39. if len(lst_url) > 2:
40. next_page = f"{lst_url[0]}={lst_url[1]}={int(lst_url[2]) + 1}"
41. else:
42. next_page = f"{current_page}&PAGEN_1=2"
43.
44. # Выполняем парсинг следующей страницы или останавливаем парсинг - возврат пустого словаря
45. yield dict() if self.completed else response.follow(next_page, callback=self.parse)
46.
47. # Метод для парсинга поста
48. def parse_post(self, response):
49. # Флаг остановки парсинга
50. out_of_limit = False
51. post_url = response.url
52. post_id = int(post_url.split("/")[-2])
53.
54. # Контейнеры
55. post = response.css("table.resptab")
56. author = response.css("table.resptab td.footerline a")
57.
58. # Интересующие нас данные
59. title = RegExp.space.sub(" ", post.css("td.headerline::text").get().strip())
60. msg = RegExp.space.sub(" ", RegExp.tag.sub(" ", post.css("td.article-text").get() or "").strip())
61. author_uid = author.attrib["href"].split("=")[-1]
62. author_login = author.css("::text").get()
63. dt = datetime.strptime(response.css("span.color-grey::text").get(), "%d.%m.%Y %H:%M")
64.
65. # Проверка на достижение поста с условной датой
66. if self.limit_date and dt < self.limit_date:
67. self.completed = True
68. out_of_limit = True
69.
70. yield Post() if out_of_limit else Post(
71. post_url=post_url,
72. post_id=post_id,
73. title=title,
74. msg=msg,
75. author_uid=author_uid,
76. author_login=author_login,
77. datetime=dt
78. )
Познавательно. Спасибо
а не проще программным роботом парсить? Или это другая тема? https://vc.ru/marketing/149696-parsing-eto-polezno-i-ne-stydno-osobenno-esli-dannye-sobiraet-robot-rpa-a-otchety-pokazyvaet-bi