En raison d'un changement soudain de travail récemment, le nouveau bureau est loin de ma résidence actuelle, je dois donc louer une nouvelle maison.
J’ai embarqué sur l’eDonkey de l’agence et j’ai commencé à explorer des coins étranges de la ville.
En passant d'une application de location à l'autre, j'étais vraiment inquiet car l'efficacité était vraiment faible :
Tout d'abord, parce que je vis avec ma petite amie, je dois tenir compte de la distance de travail des deux en même temps, les fonctions de recherche d'une maison en fonction du temps de trajet sur les plates-formes sont relativement inutiles. Certaines plates-formes ne prennent pas en charge la sélection de plusieurs emplacements en même temps, et certaines plates-formes ne peuvent sélectionner que mécaniquement des points avec le même temps de trajet. de chaque emplacement, ce qui ne peut pas répondre aux besoins des utilisateurs.
Deuxièmement, du point de vue d'un locataire, il existe trop de plateformes de location, et la logique de filtrage et de tri de chaque plateforme est incohérente, ce qui rend difficile la comparaison horizontale des informations sur des propriétés similaires.
Mais cela n’a pas d’importance. En tant que programmeur, vous devez bien sûr utiliser les méthodes des programmeurs pour résoudre les problèmes. Ainsi, hier soir, j'ai utilisé un script python pour obtenir toutes les informations sur le logement d'une plateforme de location dans la région de Shanghai, soit plus de 20 000 pièces au total :
Je vais maintenant partager avec vous tout le processus d'exploration des données.
Entrez d'abord dans la page de location de la plateforme. Vous pouvez voir que la liste des maisons sur la page d'accueil comprend déjà la plupart des informations dont nous avons besoin, et ces informations peuvent être obtenues directement auprès du dom. , pensez donc à collecter les données des pages Web directement en simulant des requêtes.
https://sh.lianjia.com/zufang/
La prochaine étape consiste donc à réfléchir à la manière d'obtenir l'URL. Grâce à l'observation, nous avons constaté qu'il y a plus de 20 000 maisons dans la zone, mais que seules les 100 premières pages de données sont accessibles via la page Web. La limite supérieure du nombre affiché sur chaque page est de 30, ce qui équivaut à un. total de 3k. Il est impossible d’obtenir toutes les informations.
Mais nous pouvons résoudre ce problème en ajoutant des conditions de filtre. Sélectionnez « Jing'an » dans l'élément de filtre et entrez l'url suivante :
https://sh.lianjia.com/zufang/jingan/
Vous pouvez voir qu'il y a plus de 2 000 maisons dans la région, avec 75 pages de données et 30 éléments par page. peut être consulté Toutes les données. Par conséquent, toutes les données de la ville peuvent être obtenues en obtenant séparément les données sur le logement dans chaque quartier.
https://sh.lianjia.com/zufang/jingan/pg2/
Après avoir cliqué sur le bouton de la deuxième page, vous entrez l'URL ci-dessus. Vous pouvez constater que tant que vous modifiez le numéro après la page, vous pouvez entrer le numéro de page correspondant.
Cependant, un problème se pose ici. Les données obtenues pour chaque visite sur le même nombre de pages sont différentes, ce qui entraînera une duplication des données collectées. Nous cliquons donc sur "Derniers ajoutés" dans les conditions de tri et entrons le lien suivant :
https://sh.lianjia.com/zufang/jingan/pg2rco11/
L'ordre des données obtenues par cette méthode de tri est stable À ce stade, notre idée est : visitez d'abord le premier de chaque petite zone. Une page, puis obtenez le nombre maximum de pages dans la région actuelle via la première page, puis accédez à la demande simulée pour accéder à chaque page afin d'obtenir toutes les données.
Une fois que vous avez une idée, vous devez commencer à écrire du code. Tout d'abord, nous devons collecter tous les liens. Le code est le suivant :
# 所有小地区对应的标识 list=['jingan','xuhui','huangpu','changning','putuo','pudong','baoshan','hongkou','yangpu','minhang','jinshan','jiading','chongming','fengxian','songjiang','qingpu'] # 存放所有链接 urls = [] for a in list: urls.append('https://sh.lianjia.com/zufang/{}/pg1rco11/'.format(a)) # 设置请求头,避免ip被ban headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.9 Safari/537.36'} # 获取当前小地区第1页的dom信息 res = requests.get('https://sh.lianjia.com/zufang/{}/pg1rco11/'.format(a), headers=headers) content = res.text soup = BeautifulSoup(content, 'html.parser') # 获取当前页面的最大页数 page_num = int(soup.find('div', attrs={'class': 'content__pg'}).attrs['data-totalpage']) for i in range(2,page_num+1): # 将所有链接保存到urls中 urls.append('https://sh.lianjia.com/zufang/{}/pg{}rco11/'.format(a,i))
Après cela, nous devons traiter les URL obtenues dans le fichier. étape précédente une par une pour obtenir les données dans le lien. , le code est le suivant :
num=1 for url in urls: print("正在处理第{}页数据...".format(str(num))) res1 = requests.get(url, headers=headers) content1 = res1.text soup1 = BeautifulSoup(content1, 'html.parser') infos = soup1.find('div', {'class': 'content__list'}).find_all('div', {'class': 'content__list--item'})
En observant la structure de la page, on peut obtenir l'emplacement de stockage de chaque élément, trouver le élément de page correspondant et obtenez les informations dont nous avons besoin.
Le code complet est joint ici. Les amis intéressés peuvent remplacer l'identifiant régional et le petit identifiant régional dans le lien en fonction de leurs propres besoins, et ils peuvent ensuite obtenir les informations de leur propre région. Les méthodes d’exploration des autres plateformes de location sont pour la plupart similaires, je n’entrerai donc pas dans les détails.
import time, re, csv, requests import codecs from bs4 import BeautifulSoup print("****处理开始****") with open(r'..sh.csv', 'wb+')as fp: fp.write(codecs.BOM_UTF8) f = open(r'..sh.csv','w+',newline='', encoding='utf-8') writer = csv.writer(f) urls = [] # 所有小地区对应的标识 list=['jingan','xuhui','huangpu','changning','putuo','pudong','baoshan','hongkou','yangpu','minhang','jinshan','jiading','chongming','fengxian','songjiang','qingpu'] # 存放所有链接 urls = [] for a in list: urls.append('https://sh.lianjia.com/zufang/{}/pg1rco11/'.format(a)) # 设置请求头,避免ip被ban headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.9 Safari/537.36'} # 获取当前小地区第1页的dom信息 res = requests.get('https://sh.lianjia.com/zufang/{}/pg1rco11/'.format(a), headers=headers) content = res.text soup = BeautifulSoup(content, 'html.parser') # 获取当前页面的最大页数 page_num = int(soup.find('div', attrs={'class': 'content__pg'}).attrs['data-totalpage']) for i in range(2,page_num+1): # 将所有链接保存到urls中 urls.append('https://sh.lianjia.com/zufang/{}/pg{}rco11/'.format(a,i)) num=1 for url in urls: # 模拟请求 print("正在处理第{}页数据...".format(str(num))) res1 = requests.get(url, headers=headers) content1 = res1.text soup1 = BeautifulSoup(content1, 'html.parser') # 读取页面中数据 infos = soup1.find('div', {'class': 'content__list'}).find_all('div', {'class': 'content__list--item'}) # 数据处理 for info in infos: house_url = 'https://sh.lianjia.com' + info.a['href'] title = info.find('p', {'class': 'content__list--item--title'}).find('a').get_text().strip() group = title.split()[0][3:] price = info.find('span', {'class': 'content__list--item-price'}).get_text() tag = info.find('p', {'class': 'content__list--item--bottom oneline'}).get_text() mixed = info.find('p', {'class': 'content__list--item--des'}).get_text() mix = re.split(r'/', mixed) address = mix[0].strip() area = mix[1].strip() door_orientation = mix[2].strip() style = mix[-1].strip() region = re.split(r'-', address)[0] writer.writerow((house_url, title, group, price, area, address, door_orientation, style, tag, region)) time.sleep(0) print("第{}页数据处理完毕,共{}条数据。".format(str(num), len(infos))) num+=1 f.close() print("****全部完成****")
Après quelques opérations, nous avons obtenu des informations complètes sur le logement auprès de différentes plateformes de location locales. À ce stade, nous pouvons déjà obtenir les données dont nous avons besoin grâce à certaines méthodes de filtrage de base.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!