前言
最近用爬虫在链家网上转了转,获取了成都所有二手房的数据(普通住宅,不含公寓、别墅等),一共5万多条,在爬数据的过程中发现了一些需要注意的问题:
- 每一组筛选条件最多只能显示100页(每页30条,一次筛选最多3000条),需要拆分筛选项来获取一个城市的所有数据,我选择按地域拆分,其它方式也可以
- 只有中心城区的二手房数据,稍远一点的区县基本没有或被归入临近的地区(看来链家的业务收缩在了中心区域)
- 筛选区域划分让我有点懵逼,一个商圈在多个区都有,有的还直接归错了
根据这些数据做了一个分析展示,可以看这里 。
代码
import requests
from fake_useragent import UserAgent
from bs4 import BeautifulSoup as bs
import re
import json
import pymongo
class LianJia:
def __init__(self):
'''
定义后面用到的属性
'''
self.start_url = 'https://cd.lianjia.com/ershoufang/rs/'
self.ua = UserAgent()
self.user_agent = self.ua.random
self.headers = {
'User-Agent': self.ua.random,
'Host': 'cd.lianjia.com',
'Referer': 'https://cd.lianjia.com/'}
self.max_count = 5
self.client = pymongo.MongoClient('localhost')
self.db = self.client.spider
def get_resp(self, url, count=1):
'''
定义通用的请求方法,后面可以重复调用
'''
if count >= self.max_count:
print('Tried Too Many Times')
return None
try:
resp = requests.get(url, headers=self.headers, timeout=30)
return resp.content.decode()
except Exception as e:
print('Error Occurred', e.args)
count += 1
return self.get_resp(url, count)
def get_zonelist(self, content):
'''
这个方法可以获取地级市下面所有区县的url
'''
if content:
soup = bs(content, 'lxml')
results = soup.select_one('div.position > dl > dd > div > div').select('a')
result_dict = {
result