Я построил паука-скрапа, чтобы пробежаться по месту работы и вернуть все работы, на которые у меня есть квалификация, чтобы мне не приходилось просматривать их каждый день.
Я правильно разбираю json:
jsonresponse = json.loads(response.body)
for item in jsonresponse:
yield{
'id':item['id'],
'date':item['date'],
'company':item['company'],
'position':item['position'],
'description':item['description'],
'url':item['url'],
}
И я настроил функцию, которая будет принимать любой файл .csv, в котором я сохраняю результаты, создаю новый в качестве резервной копии, затем создаю базу данных SQLite для выдачи результатов в:
def close(self, reason):
csv_file = max(glob.iglob('*.csv'), key=os.path.getctime)
with open(csv_file) as input, open('jobs2.csv', 'w', newline='') as output:
writer = csv.writer(output)
for row in csv.reader(input):
if any(field.strip() for field in row):
writer.writerow(row)
db = sqlite3.connect(':memory:')
csv_data = csv.DictReader(open('jobs.csv'))
cur = db.cursor()
cur.execute('''CREATE TABLE jobs_table(date TEXT PRIMARY KEY,
id TEXT,
company TEXT,
position TEXT,
description TEXT,
url TEXT)
''')
db.commit()
print('')
print('DB CREATED')
print('')
Затем я определяю список «умений» для проверки каждой строки в файле .csv, чтобы проверить, соответствует ли мне эта должность:
# skills = {'python'}
skills = ('python')
for row in csv_data:
if skills in row.get('description').lower():
print('Job Match!')
print('')
print('')
print(row)
print('')
print('')```
И вот тут я сталкиваюсь с проблемами. Он печатает, что есть совпадение, и печатает OrderedDict для первого результата:
2019-06-18 14:59:56 [scrapy.extensions.feedexport] INFO: Stored csv feed (309 items) in: jobs.csv```
DB CREATED
Job Match!
OrderedDict([('id', '73345'), ('date', '2019-06-11T14:16:33-07:00'), ('company', 'JBS Custom Software Solutions'), ('position', 'Full Stack Developer'), ('description', 'JBS Full-Stack Developer (Python, JavaScript, PostgreSQL)Required; 3+ years working with Python 3+ years working with JavaScript; Strong knowledge of modern JavaScript development practices; Strong computer science skills'), ('url', 'https://entrenous.com/jobs/73472')])```
Затем возникают проблемы, когда я пытаюсь запустить cur.execute () для вставки строк в мою "jobs_table". Вот что я попробовал (КОМАНДЫ) и что от него отказано (ОШИБКА):
COMMAND:
cur.execute('INSERT INTO jobs_table(date, id, company, position, description, url) VALUES(%s, %s, %s, %s, %s, %s)', row)
ОШИБКА:
(sqlite3.OperationalError: near "%": syntax error)
COMMAND:
cur.execute('INSERT INTO jobs_table(date, id, company, position, description, url) VALUES(?, ?, ?, ?, ?, ?)', row)
ОШИБКА:
(sqlite3.ProgrammingError: Binding 1 has no name, but you supplied a dictionary (which has only names).)
COMMAND:
cur.execute("INSERT INTO jobs_table(date, id, company, position, description, url) VALUES(date, id, company, position, description, url)", row)
ОШИБКА:
(sqlite3.OperationalError: no such column: date)
COMMAND:
cur.execute("INSERT INTO jobs_table(date, id, company, position, description, url) VALUES(:date, :id, :company, :position, :description, :url)", row)
ОШИБКА:
(sqlite3.IntegrityError: UNIQUE constraint failed: jobs_table.date)
COMMAND:
cur.execute("INSERT INTO jobs_table(date, id, company, position, description, url) VALUES('date', 'id', 'company', 'position', 'description', 'url')", row)
ОШИБКА:
(sqlite3.IntegrityError: UNIQUE constraint failed: jobs_table.date)
Я завершаю это простым коммитом, закрытием и функцией печати, чтобы я знал, что все в порядке, и я могу вернуться в постель, но, когда дела идут, я не могу вернуться в кровать.
db.commit()
db.close()
print("JOBS IMPORTED!")
Я опубликовал аналогичный вопрос ранее, но не совсем ясно, что я хотел получить от публикации здесь, поэтому вот что я хочу:
Я хочу иметь возможность сохранять только задания с ["описаниями"], которые содержат мои ["навыки"].
Остальные из них бесполезны для меня.
Есть ли кто-нибудь, кто может мне помочь с этим?