Tabla de contenido
La página original no tendrá algunos datos, puede cargarse a través de ajax y los datos se mostrarán después de cargarse uniformemente a través de ajax. El uso directo de la biblioteca de solicitudes para capturar el html original no contendrá ningún dato. Es necesario analizar el ajax enviado por la página web a la interfaz de fondo pregunta.
que es ajax
Usar javascrip para asegurarse de que la página no se actualice y el enlace no se cambie para intercambiar datos con el servidor y actualizar algunos contenidos web.
Por ejemplo, deslizarse hacia abajo para ver más es el proceso de carga de ajax.
Fundamental
var xmlhttp;
if (window.XMLHttpRequests) {
pass
} else {
xmlhttp=new.....
}
xmlhttp.onreadystatechange=function{
}
xmlhttp.open()
xmlhttp.send()
Cree un nuevo objeto XMLHttpRequests xmlhttp, luego llame al atributo onreadystatechange para configurar el oyente y finalmente llame a los métodos open y send para enviar una solicitud a un enlace. Este es el principio de la solicitud, así como el análisis del contenido y la representación. Si está interesado, puede averiguarlo usted mismo.
método de análisis ajax
El tipo de solicitud ajax es xhr, lo que significa que es una solicitud ajax.
Hay un X-Requested-With en los encabezados de las solicitudes para marcar la solicitud ajax cuando se realiza esta solicitud. Haga clic en previev para ver el contenido de la respuesta. Cambie a la
opción de respuesta para ver la información.
Análisis de Ajax y combate de rastreadores.
import pymongo
import requests
import logging
logging.basicConfig(level=logging.INFO,
format='%(asctime)s - %(levelname)s: %(message)s')
INDEX_URL = 'https://spa1.scrape.center/api/movie/?limit={limit}&offset={offset}'#把limit和offset预留出来占位符动态传入参数,构造完整列表页
MONGO_CONNECTION_STRING = 'mongodb://localhost:27017'
MONGO_DB_NAME = 'movies'
MONGO_COLLECTION_NAME = 'movies'
client = pymongo.MongoClient(MONGO_CONNECTION_STRING)
db = client['movies']
collection = db['movies']
def scrape_api(url):
logging.info('scraping %s...', url)
try:
response = requests.get(url)
if response.status_code == 200:
return response.json()
logging.error('get invalid status code %s while scraping %s',
response.status_code, url)
except requests.RequestException:
logging.error('error occurred while scraping %s', url, exc_info=True)
LIMIT = 10
def scrape_index(page):
url = INDEX_URL.format(limit=LIMIT, offset=LIMIT * (page - 1))
return scrape_api(url)
DETAIL_URL = 'https://dynamic1.scrape.center/api/movie/{id}'
def scrape_detail(id):
url = DETAIL_URL.format(id=id)
return scrape_api(url)
TOTAL_PAGE = 10
def save_data(data):
collection.update_one({
'name': data.get('name')
}, {
'$set': data
}, upsert=True)
def main():
for page in range(1, TOTAL_PAGE + 1):
index_data = scrape_index(page)
for item in index_data.get('results'):
id = item.get('id')
detail_data = scrape_detail(id)
logging.info('detail data %s', detail_data)
save_data(detail_data)
logging.info('data saved successfully')
if __name__ == '__main__':
main()