Uno, arrastra el objetivo
http://zb.yfb.qianlima.com/yfbsemsite/mesinfo/zbpglist
2. Análisis de la demanda
El requisito es sencillo, es decir, rastrear todos los datos.
Por supuesto, también puede proporcionar una función para rastrear todos los datos después de buscar una determinada palabra clave.
La dificultad es que no importa dónde haga clic, la URL siempre se ve igual, lo que aumenta la dificultad de rastreo .
Qué debe hacer el rastreador:
1. El objetivo de rastreo es una página ajax, que requiere selenium + navegador sin cabeza.
2. El cuadro de búsqueda en la página web (función opcional)
3. Botón de opción
En la página predeterminada, el tipo de información y el tiempo de selección no están todos seleccionados. Si desea rastrear todos los datos, debe cambiar estas dos opciones.
4. Seleccionar página
Tres, la tecnología clave
1. Página web dinámica: selenium + navegador sin cabeza
phantomjs.exe ya no está disponible, por lo que aquí se utiliza chromedriver.exe
Instale selenium, luego descargue chromedriver.exe y colóquelo en el directorio raíz de la unidad C. Puede usarlo para abrir la página web con el siguiente código
base_url = "http://zb.yfb.qianlima.com/yfbsemsite/mesinfo/zbpglist"
driver = webdriver.Chrome(executable_path=r'C:\chromedriver.exe', options=chrome_options,service_args=['--load-images=no'])
driver.get(base_url)
2. Botón de opción: find_element_by_xpath
Ver el código fuente de la página web, buscar el tipo de información
Entonces tenemos el código para hacer clic en el botón "Todos":
select_type_box = driver.find_element_by_xpath("//ul[@class='select_type_box clearfix']/li[1]")
select_type_box.click()
Del mismo modo, elija el tiempo
Seleccione el código de tiempo:
select_time_box = driver.find_element_by_xpath("//ul[@class='fl select_time_box']/li[1]")
select_time_box.click()
3. Página siguiente: onclick, análisis JS, captura del navegador
Pensé que era simple:
next_page = driver.find_element_by_xpath("//div[@class='pagination']/ul[1]/li[11]")
next_page.click()
Sin embargo, el error de ejecución: no se puede hacer clic en el elemento en el punto
En otras palabras, un navegador sin cabeza puede hacer clic fácilmente en el botón, pero no es tan fácil para un clic.
Entonces, comencé a colocar JS, F12 en el modo de depuración, puedo ver algunas cosas, este sitio web solo puede ver 3 js
Busqué un poco y no encontré la función de página, pero la función de página se encontró en el código fuente web
¡Encontré un enlace aquí! ! !
Me aventuré a adivinar que la palabra de búsqueda es un cuadro de búsqueda, así que lo probé
http://zb.yfb.qianlima.com/yfbsemsite/mesinfo/zbpglist?searchword=5G
¡Bastante seguro!
La misma idea volvió a fallar y ya no se encontraron vínculos similares.
Así que busqué información en Internet y encontré un artículo sobre la captura del navegador: https://blog.csdn.net/weixin_39610722/article/details/110960576
Primero active el seguimiento y luego haga clic en la página 4:
Busque la URL, haga clic derecho en copiar como cURL, el contenido es el siguiente:
curl 'http://zb.yfb.qianlima.com/yfbsemsite/mesinfo/zbpglist' \
-H 'Conexión: keep-alive' \
-H 'Cache-Control: max-age = 0' \
-H 'Upgrade- Solicitudes inseguras: 1 '\
-H' Origen: http://zb.yfb.qianlima.com '\
-H' Tipo de contenido: application / x-www-form-urlencoded '\
-H' Usuario-Agente: Mozilla / 5.0 (Windows NT 10.0; Win64; x64) AppleWebKit / 537.36 (KHTML, como Gecko) Chrome / 87.0.4280.141 Safari / 537.36 '\
-H' Aceptar: texto / html, aplicación / xhtml + xml, aplicación / xml; q = 0.9, imagen / avif, imagen / webp, imagen / apng, * / *; q = 0.8, aplicación / intercambio firmado; v = b3; q = 0.9 '\
-H' Referer: http: // zb. yfb.qianlima.com/yfbsemsite/mesinfo/zbpglist '\
-H' Aceptar-Idioma: zh-CN, zh; q = 0.9 '\
-H 'Cookie: JSESSIONID = C20E9758652DE1F141E51B349D4AE839; __jsluid_h = 2b424c9697bd9692d2ad1451300a9c75; Hm_lvt_a31e80f5423f0ff316a81cf4521eaf0d = 1610549640; pageSize = 15; palabras clave =% E5% 8D% 83% E9% 87% 8C% E9% A9% AC% E6% 8B% 9B% E6% A0% 87; keywordvaluess = ""; laiyuan = 3; Hm_lvt_0a38bdb0467f2ce847386f381ff6c0e8 = 1610550267; Hm_lpvt_0a38bdb0467f2ce847386f381ff6c0e8 = 1610550267; Hm_lvt_5dc1b78c0ab996bd6536c3a37f9ceda7 = 1610550268; Hm_lpvt_5dc1b78c0ab996bd6536c3a37f9ceda7 = 1610550268; UM_distinctid = 176fc46d0a65b3-0c99d08cd43d87-31346d-e1000-176fc46d0a7d20; gr_user_id = 97220f81-4919-4a9d-a198-24b3caf49796; pageNo = 4; Hm_lpvt_a31e80f5423f0ff316a81cf4521eaf0d = 1610560460 '\
--data-raw 'pageNo = 7 & kwname = & pageSize = 15 & ipAddress = 122.96.44.71 & searchword = & searchword2 = & hotword = & provinceId = & provinceName = & areaId = & areaName = & infoType = 0 & infoTypeName = & noticeTypes = & noticeTypesName = & secondInfoType = 5 & secondInfoTypeName = & secondInfoTypeName BF% 91% E4% B8% 80% E5% B9% B4 & searchType = 2 & clearAll = false & e_keywordid = & e_creative = & flag = 0 & source = baidu & firstTime = 1 '\
--comprimido \
--inseguro
Antes de que pueda echar un vistazo más de cerca, puedo decir de un vistazo que existe esa fórmula: pageNo = 4
Me aventuré a adivinar que esto es lo que estábamos buscando, probé http://zb.yfb.qianlima.com/yfbsemsite/mesinfo/zbpglist?pageNo=4 , ¡y realmente funciona!
De la misma manera, también obtenemos infoType y timeType
Por lo tanto, descubrimos que después de un análisis exhaustivo de JS, no hay necesidad de rastreadores, solo lea html en orden.
Luego descubrí que no importa lo que busque, no importa lo que filtre, solo se mostrarán 30 páginas como máximo y no se mostrarán más.
Se está gestando una nueva ronda de competencia. . .
Primero, tengo este enlace
Entonces pensé, tengo 1000 entradas por página, ¿por qué quiero pageNo!
Si estos datos son lo suficientemente grandes, se pueden mostrar todos los resultados de la búsqueda de palabras clave y no hay límite en el número de consultas.
Cuatro, el código
Proyecto de reptil:
# coding=utf-8
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
chrome_options = Options()
chrome_options.add_argument("--headless")
base_url = "http://zb.yfb.qianlima.com/yfbsemsite/mesinfo/zbpglist?infoType=0&timeType=0&searchword=5G&pageNo=1"
driver = webdriver.Chrome(executable_path=r'C:\chromedriver.exe', options=chrome_options,service_args=['--load-images=no'])
driver.get(base_url)
select_type_box = driver.find_element_by_xpath("//ul[@class='select_type_box clearfix']/li[1]")
select_type_box.click()
select_time_box = driver.find_element_by_xpath("//ul[@class='fl select_time_box']/li[1]")
select_time_box.click()
print(driver.page_source)
while True:
next_page = driver.find_element_by_xpath("//div[@class='pagination']/ul[1]/li[11]")
next_page.click()
print(driver.page_source)
driver.close()
Debido a que no hay necesidad de rastrear así por el momento, el código aún no se cambiará.