Python SQL не вставляет данные для всего списка URL - PullRequest
0 голосов
/ 20 октября 2019

Я использую модуль grequest для использования нескольких URL. Однако моя проблема заключается в том, что в мою базу данных вставляются данные только с одного из URL-адресов, а не с каждого из списка.

Вопрос:

Как мне решить эту проблему?

import urllib.request as urllib
import socket
import pyodbc
from datetime import datetime
import ssl
import OpenSSL
import requests
import grequests
#
# Timestamp for undersøgelse
timestamp = datetime.now().strftime('%d-%m-%Y %H:%M:%S')

List = open("C:\\Users\\Farzad\\Desktop\\hosts.txt").read().splitlines()

rs = (grequests.get(url) for url in List)

requests = grequests.map(rs)

for response in requests:
    print(response.status_code)

#SQL Connection til local database
con = pyodbc.connect('Driver={SQL Server Native Client 11.0};'
                      'Server=DESKTOP-THV2IDL;'
                      'Database=host;'
                      'Trusted_Connection=yes;')

cursor = con.cursor()

#Insert responseheader data/sikkerhedskontrollers der bliver brugt
cursor.execute('INSERT INTO host.dbo.domain (ip, Host, HSTS, HPKP, XContentTypeOptions, XFrameOptions, ContentSecurityPolicy, XXssProtection, Server, Timestamp) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)', 
        (response.url, 1, response.headers.get('Strict-Transport-Security'), response.headers.get('Public-Key-Pins'), response.headers.get('X-Content-Type-Options'), response.headers.get('X-Frame-Options'), response.headers.get('Content-Security-Policy'), response.headers.get('X-XSS-Protection'), response.headers.get('Server'), timestamp))

con.commit()

1 Ответ

0 голосов
/ 20 октября 2019

В следующих строках вы перебираете ответы:

for response in requests:
   print(response.status_code)

Затем здесь вы выполняете свой код SQL:

cursor.execute('INSERT INTO host.dbo.domain (ip, Host, HSTS, HPKP, XContentTypeOptions, XFrameOptions, ContentSecurityPolicy, XXssProtection, Server, Timestamp) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)', 
    (response.url, 1, response.headers.get('Strict-Transport-Security'), response.headers.get('Public-Key-Pins'), response.headers.get('X-Content-Type-Options'), response.headers.get('X-Frame-Options'), response.headers.get('Content-Security-Policy'), response.headers.get('X-XSS-Protection'), response.headers.get('Server'), timestamp))

Вы используете переменную response иэто атрибуты / методы для передачи в ваш код SQL. Но эта переменная ответа является просто результатом последнего запроса (последний был написан, когда вы выполняли итерацию ранее).

Если вы хотите что-то сделать с базой данных для каждого ответа, вам следует выполнить свойSQL-код для цикла.

...