Raspagem da web Parte 1

Introdução


Olá a todos. Recentemente, tive uma ideia para compartilhar com um círculo interessado de pessoas sobre como os raspadores são escritos. Como a maioria das audiências está familiarizada com o Python, todos os outros exemplos serão escritos nele.


Esta parte foi projetada para apresentar aqueles que ainda não experimentaram essa área. Se você já é um leitor avançado, pode rolar com segurança ainda mais, mas, para preservar o padrão, aconselho a prestar um pouco de atenção a este artigo.


print('Part 1. Get started')

Ferramentas


  • Linguagem de programação e bibliotecas correspondentes
    Obviamente, sem ela, em nenhum lugar. No nosso caso, o Python será usado. Essa linguagem é uma ferramenta bastante poderosa para escrever scrapers, se você puder usá-la e suas bibliotecas corretamente: request, bs4, json, lxml, re.
  • Ferramentas do desenvolvedor
    Todo navegador moderno possui esse utilitário. Pessoalmente, estou confortável em usar o Google Chrome ou Firefox. Se você usa outros navegadores, recomendo tentar uma das opções acima. Aqui precisaremos de quase todas as ferramentas: elementos, console, rede, aplicativo, depurador.
  • IDE
    , , — , debuger'a . PyCharm JetBrains.


: frontend, backend.


Frontend. HTML , -. : , , , .


Backend. backend api - json xml. , api, , . api -, .


Frontend


, . requests . headers, .. , , . : Kith


import requests

headers = {
    'authority': 'www.kith.com',
    'cache-control': 'max-age=0',
    'upgrade-insecure-requests': '1',
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.106 Safari/537.36',
    'sec-fetch-dest': 'document',
    'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
    'sec-fetch-site': 'same-origin',
    'sec-fetch-mode': 'navigate',
    'sec-fetch-user': '?1',
    'accept-language': 'en-US,en;q=0.9',
}

session = requests.session()

response = session.get("https://kith.com/collections/mens-footwear", headers=headers)

if response.status_code == 200:
    print("Success")
else:
    print("Bad result")

. (Ctrl+Shift+I) , .
: , , .


soup = BeautifulSoup(response.text, 'html.parser')

for element in soup.find_all('li', class_='collection-product'):
    name = element.find('h1', class_="product-card__title").text.strip()
    price = element.find('span', class_="product-card__price").text.strip()
    link = "https://kith.com/" + element.find('a').get('href')


class Prodcut:
    name = str
    price = str
    link = str

    def __init__(self, name, price, link):
        self.name = name
        self.price = price
        self.link = link

    def __repr__(self):
        return str(self.__dict__)

,


import requests
from bs4 import BeautifulSoup

class Prodcut:
    name = str
    price = str
    link = str

    def __init__(self, name, price, link):
        self.name = name
        self.price = price
        self.link = link

    def __repr__(self):
        return str(self.__dict__)

headers = {
    'authority': 'www.yeezysupply.com',
    'cache-control': 'max-age=0',
    'upgrade-insecure-requests': '1',
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.106 Safari/537.36',
    'sec-fetch-dest': 'document',
    'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
    'sec-fetch-site': 'same-origin',
    'sec-fetch-mode': 'navigate',
    'sec-fetch-user': '?1',
    'accept-language': 'en-US,en;q=0.9',
}

session = requests.session()

response = session.get('https://kith.com/collections/mens-footwear', headers=headers)

soup = BeautifulSoup(response.text, 'html.parser')

for element in soup.find_all('li', class_='collection-product'):
    name = element.find('h1', class_="product-card__title").text.strip()
    price = element.find('span', class_="product-card__price").text.strip()
    link = "https://kith.com/" + element.find('a').get('href')

    prodcut = Prodcut(name, price, link)

    print(prodcut.__repr__())


Examinamos as tecnologias e os princípios básicos que encontraremos nas seguintes partes. Eu recomendo que você tente concluir as tarefas com essas bibliotecas por conta própria, e também ficarei feliz em ouvir suas preferências sobre o site, que será escolhido como exemplo. A seguir, veremos como procurar pontos de API de back-end e interagir com eles.


All Articles