获取本文代码 · 我的GitHub
注:这个项目的代码会在我的GitHub持续优化、更新,而在本文中的代码则是最初版本的代码。
豆瓣小组
豆瓣有一个“小组”模块,有一些小组中会发布很多租房信息。在这里找租房信息的好处就在于,可以避免被那些第三方平台的中介忽悠,有更多的机会直接联系上房东,或有转租、寻求合租需求的人。
但是目前豆瓣租房小组存在的问题就是,信息高度不标准化,每一个人发布的信息的格式都各不相同,想要根据一些条件搜索到自己真正需要的信息比较困难,比如无法根据租金、地段、房型等条件去过滤,只能人工一个个去看,看一天下来,整个人都晕了,还不一定能找到中意的房子。
所以想到,搞一个爬虫呗,很多租房小组还是很活跃的,每天更新的信息量巨大,让人目不暇接,搞个爬虫自动化去爬取这些数据,并做一些简单的筛选,最终呈现在自己眼前,让自己找房子更有效率。
爬虫用到的技术点
使用selenium模拟登录,获取cookie,基本用法可以参见我的另一篇文章:使用selenium+requests登录网页并持久化cookie
使用requests库+cookie发送请求,获取数据。
使用lxml库和xpath语法解析网页数据,整理数据。
使用jinja2模板引擎渲染数据到HTML网页中,结构化地展示出来。
完整代码
下面的代码爬取了一个豆瓣租房小组的1000条讨论列表,从中筛选出了含有某些关键词的条目。假设将下面的代码保存在spider.py文件,则运行方式为:python spider.py 豆瓣用户名 豆瓣用户密码 讨论起始位置 要爬取的条数,代码中有详细的注释:
# coding:utf-8
# 豆瓣爬虫核心方法
from __future__ import unicode_literals
from selenium import webdriver
import requests
import time
import json
from lxml import etree
import random
from operator import itemgetter
from jinja2 import Environment, FileSystemLoader
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
class DoubanSpider(object):
'''
豆瓣爬虫
'''
def __init__(self, user_name, password, headless = False):
'''
初始化
:param user_name: 豆瓣登录用户名
:param password: 豆瓣登录用户密码
:param headless: 是否显示webdriver浏览器窗口
:return: None
'''
self.user_name = user_name
self.password = password
self.headless = headless
# 登录
self.login()
def login(self):
'''
登录,并持久化cookie
:return: None
'''
# 豆瓣登录页面URL
login_url = 'https://www.douban.com/accounts/login'
# 获取chrome的配置
opt = webdriver.ChromeOptions()
# 在运行的时候不弹出浏览器窗口
if self.headless:
opt.set_headless()
# 获取driver对象
self.driver = webdriver.Chrome(chrome_options = opt)
# 打开登录页面
self.driver.get(login_url)
print '[login] o