0X00 前言

本来之前是准备爬取boss直聘的招聘信息,结果boss的反爬还挺恶心,访问页面还得带上cookie,页面的cookie有效时间也只有一分钟,不然只能访问到等待页面,菜鸡落泪

0X01 准备工作

使用到的标准库lxml、requests、re、requests.exceptions、os和openpyxl、random、time。

0X02 分析

相比较boss来说,链家的网站对于爬虫友好得多,当然访问的时候还是得带上headers,不然也是会被识别出来是爬虫,从而被拒绝访问。

分析一下链家的url,举一个例子。https://cd.lianjia.com/ershoufang/pg1rs双流区/。

他的子域名cd.lianjia.com中的cd就对应着成都市,想要访问其他城市的房源信息就可以通过修改它来达成。

后面路径中的pg1就对应着页数,可以通过修改它来达成翻页的效果。

而rs后面的信息就是我们搜索的内容。

很明显可以看出规律 https:// + city + .lianjia.com/ershoufang/pg +页码+ rs + 搜索内容/

url分析完了,来看看链家的页面:

每一条租房信息都存在一个li标签中。

然后可能是因为他的设置原因,不管数据有再多,也只会显示100页出来,一页30条信息,一共就是3000条信息。

简单分析了一下,就下来就是代码实现。

0X03 代码实现

首先定义了两个全局变量count和total_count,用来记录爬取的页数和爬取的数据总数。

global count

global total_count

还用到了time库来记录程序运行时间。

start = time.time()#开始时间

final = time.time()#结束时间

print('爬取完毕,共花费' + str(final - start) + 's.')

这的话由于爬取的页数为100页,就直接写死了循环次数。

如果不确定页数有多少的话可以通过判断response的信息来判断是否为有效url,或者可以通过获取第一个页面下的总页数从而得知总页数的数量,这偷了个懒。

为了防止访问过于频繁从而导致ip被ban,可以使用sleep将程序挂起几秒,避免访问过于频繁。

for i in range(1, 101):

url = 'https://cd.lianjia.com/ershoufang/pg' + str(i) + 'rs双流区/'

time.sleep(random.randint(0, 3))

main(url)

然后是简单的main函数。

通过get_one_page函数得到页面的返回信息,如果返回不为None,就调用

parse_page函数来解析数据,然后存入表格中。

def main(url):

html_data = get_one_page(url)

if html_data is not None:

parse_page(html_data)

为了防止被ban,多准备几个User-Agent,然后访问的时候随机从里面取一个出来放入headers。

def get_one_page(url):

try:

ua = [

"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.163 Safari/535.1",

"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:77.0) Gecko/20100101 Firefox/77.0",

"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.163 Safari/535.1",

"Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)",

"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36",

"Opera/9.80 (Windows NT 6.1; U; zh-cn) Presto/2.9.168 Version/11.50",

"Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; GTB7.0)"

]

headers = {"User-Agent": random.choice(ua)}

response = requests.get(url=url, headers=headers)

if response.status_code == 200:

return response.text

else:

return None

except RequestException:

return None

然后就通过xpath来获取页面中我们想要的信息。

不过感觉这样显得好笨重,不知道有没有更简单的方法,害

data_text = etree.HTML(html_data)

description = data_text.xpath('//*[@id="content"]/div[1]/ul/li/div[1]/div[1]/a/text()')

address = data_text.xpath('//*[@id="content"]/div[1]/ul/li/div[1]/div[2]/div/a[1]/text()')

specific_situation = data_text.xpath('//*[@id="content"]/div[1]/ul/li/div[1]/div[3]/div/text()')

total_price = data_text.xpath('//*[@id="content"]/div[1]/ul/li/div[1]/div[6]/div[1]/span/text()')

unit_price = data_text.xpath('//*[@id="content"]/div[1]/ul/li/div[1]/div[6]/div[2]/span/text()')

attention = data_text.xpath('//*[@id="content"]/div[1]/ul/li/div[1]/div[4]/text()')

然后通过操作xlsx文件,将我们获得的信息全部存入文件当中。

0X04 完整代码

import os

import random

import time

import openpyxl

import requests

from requests.exceptions import RequestException

from lxml import etree

import re

def get_one_page(url):

try:

ua = [

"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.163 Safari/535.1",

"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:77.0) Gecko/20100101 Firefox/77.0",

"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.163 Safari/535.1",

"Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)",

"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36",

"Opera/9.80 (Windows NT 6.1; U; zh-cn) Presto/2.9.168 Version/11.50",

"Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; GTB7.0)"

]

headers = {"User-Agent": random.choice(ua)}

response = requests.get(url=url, headers=headers)

if response.status_code == 200:

return response.text

else:

return None

except RequestException:

return None

def parse_page(html_data):

data_text = etree.HTML(html_data)

description = data_text.xpath('//*[@id="content"]/div[1]/ul/li/div[1]/div[1]/a/text()')

address = data_text.xpath('//*[@id="content"]/div[1]/ul/li/div[1]/div[2]/div/a[1]/text()')

specific_situation = data_text.xpath('//*[@id="content"]/div[1]/ul/li/div[1]/div[3]/div/text()')

total_price = data_text.xpath('//*[@id="content"]/div[1]/ul/li/div[1]/div[6]/div[1]/span/text()')

unit_price = data_text.xpath('//*[@id="content"]/div[1]/ul/li/div[1]/div[6]/div[2]/span/text()')

attention = data_text.xpath('//*[@id="content"]/div[1]/ul/li/div[1]/div[4]/text()')

# 打开文件

file_name = '成都市双流区二手房源.xlsx'

global total_count

# 判断文件是否存在

if os.path.exists(file_name):

wb = openpyxl.load_workbook(file_name)

print(file_name + '打开成功!')

ws = wb.active

else:

wb = openpyxl.Workbook() # 创建文件对象

print('文件' + file_name + '创建成功!')

ws = wb.active

ws.append(['房源描述', '地址', '房源情况', '规格', '面积', '总价(万)', '单价(元/平米)', '信息发布情况'])

for i in range(0, len(description)):

price = re.search('单价(\\d*?)元/平米', unit_price[i], flags=0)

list = specific_situation[i].split(' | ')

specification = list[0]

area = re.search('(.*)平米', list[1], flags=0).group(1)

ws.append(

[description[i], address[i], specific_situation[i], specification, area, total_price[i], price.group(1),

attention[i]])

total_count += 1

global count

count += 1

print('第' + str(count) + '页爬取成功!')

wb.save(filename=file_name)

def main(url):

html_data = get_one_page(url)

if html_data is not None:

parse_page(html_data)

if __name__ == '__main__':

global count

global total_count

count = 0

total_count = 0

start = time.time()

for i in range(1, 101):

url = 'https://cd.lianjia.com/ershoufang/pg' + str(i) + 'rs双流区/'

time.sleep(random.randint(0, 3))

main(url)

final = time.time()

print('爬取完毕,共花费' + str(final - start) + 's.')

print('共爬取' + str(count) + '页数据')

print('共爬取' + str(total_count) + '条数据')

0X05 成果图

下次应该会学一学python的数据分析来分析分析爬取到的数据?应该吧,应该不会鸽吧,害。

python爬房源信息_python爬虫获取链家二手房源信息相关推荐

  1. python爬取前程无忧_Python爬虫获取51job的51job代码,python,抓取,前程无忧

    为了结果直观,做的简单 网页地址: https://search.51job.com/list/180200,000000,0000,00,9,99,%25E6%25AD%25A6%25E6%25B1 ...

  2. Python常用插件类举,lxml+Xpath实现爬虫,使用Xpath爬取链家二手房源信息

    目录 一.XPath 二.XPath 常用规则 三.在谷歌浏览器安装XPath插件 四.Python爬虫常用插件 五.使用Xpath解析 六.Xpath匹配示例 1.查看所有的标签(如p.a.li标签 ...

  3. 手把手教你利用Python网络爬虫获取链家网的房产信息

    点击上方"Python爬虫与数据挖掘",进行关注 回复"书籍"即可获赠Python从入门到进阶共10本电子书 今 日 鸡 汤 夜阑卧听风吹雨,铁马冰河入梦来. ...

  4. python链家网爬虫_手把手教你利用Python网络爬虫获取链家网的房产信息

    点击上方" Python爬虫与数据挖掘 ",进行关注 回复"书籍"即可获赠Python从入门到进阶共10本电子书 今 日 鸡 汤 夜阑卧听风吹雨,铁马冰河入梦来 ...

  5. python 爬视频下载_Python爬虫进阶之爬取某视频并下载的实现

    这篇文章我们来讲一下在网站建设中,Python爬虫进阶之爬取某视频并下载的实现.本文对大家进行网站开发设计工作或者学习都有一定帮助,下面让我们进入正文. 这几天在家闲得无聊,意外的挖掘到了一个资源网站 ...

  6. python爬取网页内容_Python爬虫原理解析

    笔者公众号:技术杂学铺 笔者网站:mwhitelab.com 本文将从何为爬虫.网页结构.python代码实现等方面逐步解析网络爬虫. 1. 何为爬虫 如今互联网上存储着大量的信息. 作为普通网民,我 ...

  7. python 爬网站 实例_python爬虫实战:之爬取京东商城实例教程!(含源代码)

    前言: 本文主要介绍的是利用python爬取京东商城的方法,文中介绍的非常详细,下面话不多说了,来看看详细的介绍吧. 主要工具 scrapy BeautifulSoup requests 分析步骤 1 ...

  8. python爬京东联盟_python爬虫框架scrapy实战之爬取京东商城进阶篇

    前言 之前的一篇文章已经讲过怎样获取链接,怎样获得参数了,详情请看python爬取京东商城普通篇,本文将详细介绍利用python爬虫框架scrapy如何爬取京东商城,下面话不多说了,来看看详细的介绍吧 ...

  9. 如何运用python爬游戏皮肤_Python爬虫练习:20行Python代码爬取王者荣耀全英雄皮肤...

    引言王者荣耀大家都玩过吧,没玩过的也应该听说过,作为时下最火的手机MOBA游戏,咳咳,好像跑题了.我们今天的重点是爬取王者荣耀所有英雄的所有皮肤,而且仅仅使用20行Python代码即可完成. 准备工作 ...

  10. python爬取喜马拉雅_Python爬虫实战案例之爬取喜马拉雅音频数据详解

    这篇文章我们来讲一下在网站建设中,Python爬虫实战案例之爬取喜马拉雅音频数据详解.本文对大家进行网站开发设计工作或者学习都有一定帮助,下面让我们进入正文. 前言 喜马拉雅是专业的音频分享平台,汇集 ...

最新文章

  1. 使用cmake组建跨平台项目
  2. python字典遍历的几种方法(for in 用法)
  3. 全文!《2018中国IoT报告》!
  4. 大数据可视化及发展趋势
  5. 如何定义一个有效的OWIN Startup Class
  6. 数字和为sum的方法数-01背包计数问题
  7. kvm虚拟化_KVM 虚拟化环境搭建 - WebVirtMgr
  8. docker镜像没有ifconfig、ping指令
  9. 执行文件mysql使用source 命令乱码问题
  10. QT5日志功能(qDebug、qWarnng、qCritical、qFatal)
  11. 可编程模拟IC之考虑[zz]
  12. UNP学习笔记3——基本UDP套接字编程
  13. 【LoadRunner】解决LR11无法录制Chrome浏览器脚本问题
  14. 修改MySQL用户的host属性_如何快速修改MySQL用户的host属性
  15. octave存储文档
  16. Redis源码分析之内存检测memtest
  17. 德龙钢铁大脑:更锐的眼,更快的脑
  18. Redis主从复制(master/slaver)
  19. 【洛谷】P1419 寻找段落
  20. python脚本控制ios手机app_iOS自动打包ipa(Python脚本)

热门文章

  1. Win7定时任务——提醒自己喝水
  2. 单片机复位电路的简谈
  3. 14年macmini装双硬盘_2011中Mac Mini详尽拆解 可装两块硬盘
  4. 关于电平转换电路1.8V转3.3V
  5. windows开机老显示请选择要启动的操作系统
  6. 你有多久没有看星星了呢?【爬取NASA的科普网站上的所有图片】
  7. android 读取sdcard图片 不显示,Android 读取sdcard上的图片实例(必看)
  8. python windows下载哪个_初识Python(windows)——下载、安装、使用
  9. html中heading标签,Heading标签优化实战经验分享
  10. Kubernetes上基于longhorn和statefulsets的pv空间扩展