¿Puede Python rastrear datos en Mafengwo?
Por supuesto.
Análisis del código rastreador
¿Primero necesitamos rastrear la página?
Podemos ver que la URL es www.mafengwo.cn/group/s.php ?q=Bangkokamp;p=1amp;t=cateamp;kt=1. Los parámetros principales son q?, p?, t, donde q es el nombre de la ciudad, p es el número de página, t es la categoría, cate es la comida y kt es el parámetro que no afecta.
Necesita obtener la página, el detalle es el parámetro después del nombre de dominio, esta función se puede usar para obtener la página web bajo la página de inicio del nombre de dominio
#Obtener la página inferior página de nivel
def getDetailPage (detailURL):
pruebe:
url = "" detalleURL"
request = urllib2.Request( url)
respuesta = urllib2.urlopen(request)
#Utilice el método Request de urllib2 para devolver un objeto de solicitud y ábralo con urlopen
page = respuesta.read()
#Utilice el método read () para leer el contenido de la página, Entrada: imprimir página Salida: Página html
pageCode = re.sub(r'lt;br[] ?/?gt;', '\n', página)
#Eliminar líneas en blanco de retorno de carro en html
regresar código de página
excepto urllib2.URLError, e:
if hasattr(e , "reason"):
imprimir e.reason
return None12345678910111213141516
Obtener el enlace de en cada tienda de alimentos, primero realice una verificación de elementos para ver dónde se encuentra el enlace
#Get enlace de tienda de página única de alimentos
def getFoodHref(self, pageid):
url = "/group/s.php?q=" self .city "amp;p=" str(pageid) "amp;t=cateamp;kt=1"
página = getDetailPage (url) #Llame a getDetailPage para obtener la página
soup = BeautifulSoup(page, 'html.parser') #Utilice BeautifulSoup para analizar la página
FoodHref = []
FoodLists = ?soup.find(name="div", attrs={ 'data-category':'poi'}).ul
FoodHrefList = FoodLists.find_all("h3") # Encuéntrelo; div class="_j_search_section" data-category="poi"gt; El contenido de todas las etiquetas para FoodHrefs en FoodHrefList. : FoodWebsite = FoodHrefs.a['href'] #pair list Bucle para encontrar el valor del atributo href de la etiqueta a, que es la URL de la tienda FoodHrefShort = str(FoodWebsite).replace('','') #Elimine el nombre de dominio antes de la URL para que se pueda llamar a la función getDetaiL más tarde, páselo para obtener la página de la tienda FoodHref.append (FoodHrefShort) devolver FoodHref12345678910 1112131415161718 A continuación, llame a getDetailPage() nuevamente y pase FoodHref para obtener la página de la tienda y obtener la información a través de BeautifulSoup. Pero encontré un problema al buscar. ? Esta es una tienda con información completa, pero algunas tiendas no tienen dirección de sitio web ni información de tráfico. ¿Qué debo hacer? Por ejemplo, ¿este? Después de la inspección de elementos, se encontró que las etiquetas son las mismas y es imposible realizar un rastreo dirigido a través de los atributos únicos o valores de clase de la etiqueta. Verificar los nodos hermanos de los nodos secundarios de lt;div class="bd"gt; tampoco funciona. Más tarde descubrí una manera. Primero escriba una función coincidente hasAttr. El parámetro de lista es una lista de nombres de información completos en chino. En el método getShopInfo, el contenido de la lista se repite para coincidir con el lt;div class="bd". "gt; contenido de la etiqueta. Si se devuelve True, significa que el elemento de información existe; de lo contrario, continúe coincidiendo con el siguiente elemento. Por ejemplo, en la imagen de arriba, el perfil coincide primero. Si la coincidencia falla, la coincidencia continúa con el nombre en inglés, que también falla hasta que se coincide con la dirección, se logra y se muestra el contenido de la etiqueta al lado de la dirección. salvado. hasta obtener toda la información. #Determinar si existe una lista de información def hasAttr(self, list): soup = BeautifulSoup(page, 'html.parser') col = sopa.find("div", class_="col-main").find("div", class_="bd") str_col = str(col) si la lista está en str_col: devuelve Verdadero de lo contrario: devuelve Falso #Obtener información de la tienda def getShopInfo(self, página): shopInfoList = ['brief', 'localName', 'ubicación', 'teléfono', 'sitio web', 'ticket', 'openTime', 'shopName', 'shopScore'] infoItem = [ 'Introducción', 'Nombre en inglés', 'Dirección', 'Teléfono', 'Sitio web', 'Entradas', 'Horario de apertura', 'Nombre', 'Reseñas de estrellas'] sopa = BeautifulSoup( página, 'html.parser') shopName = sopa.find("div", class_="wrapper").h1.string shopScore = sopa.find("div " , class_="col-main").span.em.string para i en rango(0, 6): #Búsqueda en bucle de elementos de información if self.hasAttr(page, infoItem[i] ): pattern_shopinfo = re.compile( 'lt; div class="col-main.*?lt; div class="bd"gt; .*?' infoItem[i] 'lt;/ h3gt; .*?gt;(.*?)lt;/pgt;', re.S) shopInfos = re.findall(pattern_shopinfo, página) #Si este elemento existe, use expresiones regulares para extraiga el contenido de la etiqueta para shopInfo en shopInfos: shopInfoList[i] = shopInfo else: #Continuar para encontrar el siguiente artículo continuar shopInfoList[7] = shopName shopInfoList[8] = shopScore return shopInfoList1234567891011121314151617181920212223242526272829303132333435 Finalmente agregue los datos al diccionario si una clave es para múltiples valores, como dict. = {a:[]}, conjunto de llamadas predeterminado(nombre de clave, []).append(valor de lista)? dict.set default('comment', []).appnd(comment) Luego json.dumps(dict, indent=1).decode("unicode_escape"). El parámetro de sangría es para mostrar los datos en forma de árbol json. Si hay chino en el contenido, se debe usar decode ("unicode_escape"); de lo contrario, el resultado será la codificación Unicode de "\u"