Проблема с БД WebCrawler - PullRequest
0 голосов
/ 04 мая 2020

Я действительно новичок в кодировании. Я создал веб-сканер, который работает нормально, однако после анализа моя таблица SQLite содержит меньше элементов, чем на веб-странице. Кроме того, «id» как-то колеблется от «1» в первом ряду до «92» во втором и так далее. Пожалуйста, помогите мне!

снимок экрана базы данных SQLite с указанием упомянутой проблемы

import requests
from bs4 import BeautifulSoup
import re
import sqlite3

conn = sqlite3.connect('zink.sqlite')
cur = conn.cursor()

cur.executescript('''
DROP TABLE IF EXISTS iHerb;
CREATE TABLE iHerb (
    id  INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE,
    title    TEXT UNIQUE,
    dosage    TEXT UNIQUE,
    side_effects    TEXT UNIQUE,
    link    TEXT UNIQUE
)
''')


def getTitle(link):
    title = ''
    title1 = link.find('h1', id='name').text
    #to ommit the brand name which appears at the beginning of each title
    title = title1[14:]
    return title

def getDosage(link):
    dosage = ''
    dosage1 = link.find_all('tr')
    for link in dosage1:
        # i don't how to extract differently because there is a multitude of 'td' tags
        if re.search(('Zinc.+mg'), str(link)):
            link = link.find_all('td')
            dosage = link[0].text + ': ' + link[1].text
    return dosage

def getSide_ef(link):
    side_ef = ''
    side_ef1 = link.find_all('div', class_="prodOverviewDetail")
    side_ef = side_ef1[1].text
    return(side_ef)


def scrape(url):

    "Authenticating User-Agent request header"
    headers = requests.utils.default_headers()
    headers.update({
        'User-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:52.0) Gecko/20100101 Firefox/52.0',
    })
    start_link = requests.get(url)
    start_html = start_link.content

    soup = BeautifulSoup(start_html, 'html.parser')
    links = soup.find_all('a', class_='absolute-link product-link')

    for link in links:
        url = link.get('href')
        drug_link = requests.get(url, headers=headers)
        drug_html = drug_link.content
        embedded_link = BeautifulSoup(drug_html, 'html.parser')
        for element in embedded_link:
            title = getTitle(embedded_link)
            dosage = getDosage(embedded_link)
            side_ef = getSide_ef(embedded_link)
            tab_url = url

            cur.execute('''INSERT OR IGNORE INTO iHerb (title, dosage, side_effects, link)
                        VALUES ( ?, ?, ?, ? )''', (title, dosage, side_ef, tab_url))
            conn.commit()


scrape('https://ua.iherb.com/search?sug=zinc&kw=zinc&rank=0&cids=1855&bids=NWY')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...