思来自己从写第一个程序到现在已有八年之久,熟练的编程语言也仅有C++,期间也学习过其他编程语言,蓦然回首发现已全然不记得,如狗熊掰棒子,最后怀里只剩下最后一个,自认为还算一个优秀程序员只会一种编程语言有点拿不出手,很是惭愧。静下心来想学python,其实自己的第一个程序也就是他了,这次学一定要搜索积淀,不能学完了也就忘完了,最好的方式是以实战为中心,亦即做一点实战项目,python名气最大的应该是爬虫,那就以爬虫为学习切入点记录一下自己学习路程,本篇为第一篇以后不做类似无关话的乱BB。爬虫系列文章主要是转载别人写的文章,里面会附带原文链接,和原文详细内容(怕原文章文章丢失),会有自己的理解和更新之后的代码(很多情况源代码已失效,需要稍作更改),主要是记录下自己学习足迹。爬虫系列文章主要记录爬虫实战,对python语法和技术不会做详细记录。

原文链接:https://www.cnblogs.com/Tsukasa/p/6799968.html

前言

作为一只小白,刚进入Python爬虫领域,今天尝试一下爬取链家的二手房,之前已经爬取了房天下的了,看看链家有什么不同,马上开始。

一、分析观察爬取网站结构

这里以广州链家二手房为例:http://gz.lianjia.com/ershoufang/

这是第一页,我们看看第二页的url会有什么变化发现多出来一个/g2,第三页/pg3,那么原始的是不是就是增加/pg1呢,我们测试一下http://gz.lianjia.com/ershoufang/pg1/  ==  http://gz.lianjia.com/ershoufang/那么问题不大,我们继续分析。

这些就是我们想得到的二手房资讯,但是这个是有链接可以点进去的,我们看看:

里面的二手房资讯更加全面,那我是想得到这个网页里面的资讯了。

二、编写爬虫

1.得到url

  我们先可以得到全部详细的链接,这里有100页,那么我们可以http://gz.lianjia.com/ershoufang/pg1/.../pg2.../pg3.../pg100    先生成全部url,再从这些url得到每一页里面详细的url,再从详细的url分析html得到我想要的资讯。

2.分析  htmlhttp://gz.lianjia.com/ershoufang/pg1/

  先打开chrom自带的开发者工具分析里面的network,把preserve log勾上,清空,然后我们刷新一下网页。

发现get:http://gz.lianjia.com/ershoufang/pg1/请求到的html

那么我们就可以开始生成全部url先了:

1

2

3

4

5

6

7

8

9

10

11

12

def generate_allurl(user_in_nub):

    url = 'http://gz.lianjia.com/ershoufang/pg{}/'

    for url_next in range(1,int(user_in_nub)):

        yield url.format(url_next)

def main():

    user_in_nub = input('输入生成页数:')

    for in generate_allurl(user_in_nub):

        print(i)

if __name__ == '__main__':

    main()

  运行结果:

这样我们就生成了100页的url

然后我们就要分析这些url里面的详细每一页的url:

  先分析网页结构,

  发现我们要的url是再class为title里面的a标签,我们可以使用request来获取html,用正则表达法来分析获取详情页url:

import requests

1

import re

  def一个方法,把得到的generate_allurl传进来再打印一下看看

1

2

3

4

5

6

def get_allurl(generate_allurl):

    get_url = requests.get(generate_allurl,)

    if get_url.status_code == 200:

        re_set = re.compile('<li.*?class="clear">.*?<a.*?class="img.*?".*?href="(.*?)"')

        re_get = re.findall(re_set,get_url.text)

        print(re_get)

  

      正常获取详细页的链接

下一步我们就要分析这些详细页连接以获取里面的资讯,使用自带开发者工具点击这个箭头可以选择网页元素:

  

    发现资讯在一个class为main里面,可以用BeautifulSoup模块里面的方法得到:

1

from bs4 import BeautifulSoup

  定义一个方法来把详情url链接传进来分析:

1

2

3

4

5

6

7

8

9

def open_url(re_get):

    res = requests.get(re_get)

    if res.status_code == 200:

        info = {}

        soup = BeautifulSoup(res.text,'lxml')

        info['标题'= soup.select('.main')[0].text

        info['总价'= soup.select('.total')[0].text + '万'

        info['每平方售价'= soup.select('.unitPriceValue')[0].text

        return info

  这里把requests.get对象传给res,然后把这个变量传给BeautifulSoup,用lxml解析器解析,再把结果传给soup,然后就可以soup.select方法来筛选,因为上面标题在,main下:

      soup.select('.main'),因为这里是一个class,所以前面要加.,如果筛选的是id,则加#。

得到如下结果:

是一个list,所以我们要加[ 0 ]取出,然后可以运用方法 .text得到文本。

def open_url(re_get):res = requests.get(re_get)if res.status_code == 200:soup = BeautifulSoup(res.text,'lxml')title = soup.select('.main')[0].textprint(title)

      得到结果

      然后还可以添加到字典,return返回字典:

1

2

3

4

5

6

7

8

9

def open_url(re_get):

    res = requests.get(re_get)

    if res.status_code == 200:

        info = {}

        soup = BeautifulSoup(res.text,'lxml')

        info['标题'= soup.select('.main')[0].text

        info['总价'= soup.select('.total')[0].text + '万'

        info['每平方售价'= soup.select('.unitPriceValue')[0].text

        return info

        得到结果:

        还可以储存到xlsx文档里面:

1

2

3

def pandas_to_xlsx(info):

    pd_look = pd.DataFrame(info)

    pd_look.to_excel('链家二手房.xlsx',sheet_name='链家二手房')

        

      ok基本完成,可能有没有说清楚的,留言我继续更新

 1 #!/usr/bin/env python32 # -*- coding: utf-8 -*-3 # Author;Tsukasa4 5 import json6 from multiprocessing import Pool7 import requests8 from bs4 import BeautifulSoup9 import re
10 import pandas as pd
11 import pymongo
12
13
14 def generate_allurl(user_in_nub, user_in_city):  # 生成url
15     url = 'http://' + user_in_city + '.lianjia.com/ershoufang/pg{}/'
16     for url_next in range(1, int(user_in_nub)):
17         yield url.format(url_next)
18
19
20 def get_allurl(generate_allurl):  # 分析url解析出每一页的详细url
21     get_url = requests.get(generate_allurl, 'lxml')
22     if get_url.status_code == 200:
23         re_set = re.compile('<li.*?class="clear">.*?<a.*?class="img.*?".*?href="(.*?)"')
24         re_get = re.findall(re_set, get_url.text)
25         return re_get
26
27
28 def open_url(re_get):  # 分析详细url获取所需信息
29     res = requests.get(re_get)
30     if res.status_code == 200:
31         info = {}
32         soup = BeautifulSoup(res.text, 'lxml')
33         info['标题'] = soup.select('.main')[0].text
34         info['总价'] = soup.select('.total')[0].text + '万'
35         info['每平方售价'] = soup.select('.unitPriceValue')[0].text
36         info['参考总价'] = soup.select('.taxtext')[0].text
37         info['建造时间'] = soup.select('.subInfo')[2].text
38         info['小区名称'] = soup.select('.info')[0].text
39         info['所在区域'] = soup.select('.info a')[0].text + ':' + soup.select('.info a')[1].text
40         info['链家编号'] = str(re_get)[33:].rsplit('.html')[0]
41         for i in soup.select('.base li'):
42             i = str(i)
43             if '</span>' in i or len(i) > 0:
44                 key, value = (i.split('</span>'))
45                 info[key[24:]] = value.rsplit('</li>')[0]
46         for i in soup.select('.transaction li'):
47             i = str(i)
48             if '</span>' in i and len(i) > 0 and '抵押信息' not in i:
49                 key, value = (i.split('</span>'))
50                 info[key[24:]] = value.rsplit('</li>')[0]
51         print(info)
52         return info
53
54
55 def update_to_MongoDB(one_page):  # update储存到MongoDB
56     if db[Mongo_TABLE].update({'链家编号': one_page['链家编号']}, {'$set': one_page}, True): #去重复
57         print('储存MongoDB 成功!')
58         return True
59     return False
60
61
62 def pandas_to_xlsx(info):  # 储存到xlsx
63     pd_look = pd.DataFrame(info)
64     pd_look.to_excel('链家二手房.xlsx', sheet_name='链家二手房')
65
66
67 def writer_to_text(list):  # 储存到text
68     with open('链家二手房.text', 'a', encoding='utf-8')as f:
69         f.write(json.dumps(list, ensure_ascii=False) + '\n')
70         f.close()
71
72
73 def main(url):
74
75     writer_to_text(open_url(url))    #储存到text文件
76     # update_to_MongoDB(list)   #储存到Mongodb
77
78
79 if __name__ == '__main__':
80     user_in_city = input('输入爬取城市:')
81     user_in_nub = input('输入爬取页数:')
82
83     Mongo_Url = 'localhost'
84     Mongo_DB = 'Lianjia'
85     Mongo_TABLE = 'Lianjia' + '\n' + str('zs')
86     client = pymongo.MongoClient(Mongo_Url)
87     db = client[Mongo_DB]
88     pool = Pool()
89     for i in generate_allurl('2', 'zs'):
90         pool.map(main, [url for url in get_allurl(i)])

源码地址:https://gist.github.com/Tsukasa007/660fce644b7dd33afc57998fdc6c376a

为了更好

========以上为转载,拷贝过来主要担心原文章丢失,下面是自己的实际测试===========

简单修改如下:

import json
from multiprocessing import Pool
import requests
from bs4 import BeautifulSoup
import re
import pandas as pd
import pymongosession=requests.session()def generate_allurl(user_in_nub, user_in_city):  # 生成urlurl = 'http://' + user_in_city + '.lianjia.com/ershoufang/pg{}/'for url_next in range(1, int(user_in_nub)):yield url.format(url_next)def get_allurl(generate_allurl):  # 分析url解析出每一页的详细url#这里模拟一下请求头,头文件是从浏览器里面抓到的,否则服务会回复403错误,(其实就是服务器做的简单防爬虫检测)headers={'Host':'xa.lianjia.com','Connection':'keep-alive','Upgrade-Insecure-Requests': '1','User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 SE 2.X MetaSr 1.0','Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8','Accept-Encoding': 'gzip, deflate, sdch, br','Accept-Language': 'zh-CN,zh;q=0.8','Cookie':'TY_SESSION_ID=bd212f0d-fa69-41b2-bd24-b147b1aa6f93; lianjia_uuid=4479a173-a725-499e-ae06-99e9e2d78c3a; UM_distinctid=167e9c20cd221b-0d1bfec5576324-10724c6f-1fa400-167e9c20cd42aa; select_city=442000; _jzqckmp=1; all-lj=c60bf575348a3bc08fb27ee73be8c666; Hm_lvt_9152f8221cb6243a53c83b956842be8a=1546392681,1546572269,1546591543,1546591988; Hm_lpvt_9152f8221cb6243a53c83b956842be8a=1546591988; _smt_uid=5c23441b.121b752a; CNZZDATA1254525948=1906388473-1545883862-%7C1546590852; CNZZDATA1255633284=2126119324-1545884076-%7C1546587312; CNZZDATA1255604082=1549936819-1545883843-%7C1546591140; _jzqa=1.351604181808559040.1545815068.1546591544.1546591990.9; _jzqc=1; _jzqb=1.1.10.1546591990.1; _qzja=1.757497874.1545885920295.1546591543773.1546591989755.1546591839817.1546591989755.0.0.0.10.7; _qzjb=1.1546591543773.4.0.0.0; _qzjc=1; _qzjto=5.3.0; _ga=GA1.2.763502423.1545815070; _gid=GA1.2.1829352401.1546591547; lianjia_ssid=f3e5db05-9789-4d8e-aae2-80b919a3cfa8'}session.headers.clear()session.headers.update(headers)get_url = session.get(generate_allurl)if get_url.status_code == 200:#原来代码用没有正则搜索出结果,这里屏蔽下,用BS完成所有赛选#re_set = re.compile('<li.*?class="clear">.*?<a.*?class="img.*?".*?href="(.*?)"')#re_get = re.findall(re_set, get_url.text)soup = BeautifulSoup(get_url.text, 'html5lib')# liitem = soup.findall('li',{'class':'clear LOGCLICKDATA'})urls=[]liitems = soup.select('li.clear.LOGCLICKDATA')for item in liitems:url = item.select('a')[0]['href']urls.append(url)return urlsdef open_url(re_get):  # 分析详细url获取所需信息headers={'Host':'xa.lianjia.com','Connection':'keep-alive','Upgrade-Insecure-Requests': '1','User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 SE 2.X MetaSr 1.0','Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8','Accept-Encoding': 'gzip, deflate, sdch, br','Accept-Language': 'zh-CN,zh;q=0.8','Cookie':'TY_SESSION_ID=bd212f0d-fa69-41b2-bd24-b147b1aa6f93; lianjia_uuid=4479a173-a725-499e-ae06-99e9e2d78c3a; UM_distinctid=167e9c20cd221b-0d1bfec5576324-10724c6f-1fa400-167e9c20cd42aa; select_city=442000; _jzqckmp=1; all-lj=c60bf575348a3bc08fb27ee73be8c666; Hm_lvt_9152f8221cb6243a53c83b956842be8a=1546392681,1546572269,1546591543,1546591988; Hm_lpvt_9152f8221cb6243a53c83b956842be8a=1546591988; _smt_uid=5c23441b.121b752a; CNZZDATA1254525948=1906388473-1545883862-%7C1546590852; CNZZDATA1255633284=2126119324-1545884076-%7C1546587312; CNZZDATA1255604082=1549936819-1545883843-%7C1546591140; _jzqa=1.351604181808559040.1545815068.1546591544.1546591990.9; _jzqc=1; _jzqb=1.1.10.1546591990.1; _qzja=1.757497874.1545885920295.1546591543773.1546591989755.1546591839817.1546591989755.0.0.0.10.7; _qzjb=1.1546591543773.4.0.0.0; _qzjc=1; _qzjto=5.3.0; _ga=GA1.2.763502423.1545815070; _gid=GA1.2.1829352401.1546591547; lianjia_ssid=f3e5db05-9789-4d8e-aae2-80b919a3cfa8'}session.headers.clear()session.headers.update(headers)res = session.get(re_get)if res.status_code == 200:info = {}soup = BeautifulSoup(res.text, 'lxml')info['标题'] = soup.select('.main')[0].textinfo['总价'] = soup.select('.total')[0].text + '万'info['每平方售价'] = soup.select('.unitPriceValue')[0].textinfo['参考总价'] = soup.select('.taxtext')[0].textinfo['建造时间'] = soup.select('.subInfo')[2].textinfo['小区名称'] = soup.select('.info')[0].textinfo['所在区域'] = soup.select('.info a')[0].text + ':' + soup.select('.info a')[1].textinfo['链家编号'] = str(re_get)[34:].rsplit('.html')[0]# for i in soup.select('.base li'):#     i = str(i)#     if '</span>' in i or len(i) > 0:#         key, value = (i.split('</span>'))#         info[key[24:]] = value.rsplit('</li>')[0]# for i in soup.select('.transaction li'):#     i = str(i)#     if '</span>' in i and len(i) > 0 and '抵押信息' not in i:#         key, value = (i.split('</span>'))#         info[key[24:]] = value.rsplit('</li>')[0]print(info)return infodef update_to_MongoDB(one_page):  # update储存到MongoDBMongo_Url = 'localhost'Mongo_DB = 'Lianjia'Mongo_TABLE = 'Lianjia' + '\n' + str('zs')client = pymongo.MongoClient(Mongo_Url)db = client[Mongo_DB]if db[Mongo_TABLE].update({'链家编号': one_page['链家编号']}, {'$set': one_page}, True): #去重复# print('储存MongoDB 成功!')return Truereturn False# pandas写excel只找到了一次写入没找到追加方式,暂时不用吧
def pandas_to_xlsx(info):  # 储存到xlsxpd_look = pd.DataFrame(info,index = False)pd_look.to_excel('链家二手房.xlsx', sheet_name='链家二手房')def writer_to_text(list):  # 储存到textwith open('链家二手房.text', 'a', encoding='utf-8')as f:f.write(json.dumps(list, ensure_ascii=False) + '\n')f.close()def main(url):info = open_url(url)writer_to_text(info)    #储存到text文件# pandas_to_xlsx(info)    #储存到xlsx文件update_to_MongoDB(info)   #储存到Mongodbif __name__ == '__main__':# user_in_city = input('输入爬取城市:')# user_in_nub = input('输入爬取页数:')pool = Pool()for i in generate_allurl('2', 'xa'):pool.map(main, [url for url in get_allurl(i)])

PyCharm运行截图:

存储到text和MongoDB截图:

python3爬虫(1)爬取链家二手房相关推荐

  1. 掌财社:python怎么爬取链家二手房的数据?爬虫实战!

    我们知道爬虫的比较常见的应用都是应用在数据分析上,爬虫作为数据分析的前驱,它负责数据的收集.今天我们以python爬取链家二手房数据为例来进行一个python爬虫实战.(内附python爬虫源代码) ...

  2. python-scrapy-MongoDB 爬取链家二手房

    python-scrapy-MongoDB 爬取链家二手房 链家二手房房源数据抓取 目标网址为http://bj.lianjia.com/ershoufang/ 分析网址 创建项目 scrapy st ...

  3. python关于二手房的课程论文_基于python爬取链家二手房信息代码示例

    基本环境配置 python 3.6 pycharm requests parsel time 相关模块pip安装即可 确定目标网页数据 哦豁,这个价格..................看到都觉得脑阔 ...

  4. 租房不入坑不进坑,Python爬取链家二手房的数据,提前了解租房信息

    目录 前言 一.查找数据所在位置: 二.确定数据存放位置: 三.获取html数据: 四.解析html,提取有用数据: 前言 贫穷限制了我的想象,从大学进入到社会这么久,从刚开始的兴致勃勃,觉得钱有什么 ...

  5. Python 小项目 01 爬虫项目 爬取链家网南京地区二手房信息

    SpiderLianjia 介绍 python爬虫小程序,爬取链家网南京地区普通住宅二手房数据. 代码下载: https://gitee.com/lihaogn/SpiderLianjia 1 程序设 ...

  6. 【爬虫】爬取链家网青城山二手房源信息

    一.项目背景 本项目是用python爬虫来实现爬取链家网青城山的二手房信息,我们小组是针对于在我们成都东软学院周边的二手房信息做一个数据爬取和建表.我们小组做这个项目的背景是因为在不久的将来,我们大学 ...

  7. python爬取链家新房_Python爬虫项目--爬取链家热门城市新房

    本次实战是利用爬虫爬取链家的新房(声明: 内容仅用于学习交流, 请勿用作商业用途) 环境 win8, python 3.7, pycharm 正文 1. 目标网站分析 通过分析, 找出相关url, 确 ...

  8. Python 爬取链家二手房,我在北京买房的经历

    本节所讲内容: 链家网站前期分析 利用requests爬取数据 爬取数据存储MongoDB(代码请看最后) 链家网站前期分析 今天我们主要对链家二手房数据爬取,看下我们目前的资金能买那一套.链家二手房 ...

  9. python爬取链家_python+scrapy爬虫(爬取链家的二手房信息)

    之前用过selenium和request爬取数据,但是感觉速度慢,然后看了下scrapy教程,准备用这个框架爬取试一下. 1.目的:通过爬取成都链家的二手房信息,主要包含小区名,小区周边环境,小区楼层 ...

  10. 爬虫,爬取链家网北京二手房信息

    # 链家网二手房信息爬取 import re import time import requests import pandas as pd from bs4 import BeautifulSoup ...

最新文章

  1. 习题2.5 两个有序链表序列的合并 (15 分)
  2. bzoj 2251: [2010Beijing Wc]外星联络
  3. 工作399-openType=“getUserInfo“ lang=“zh_CN“ bindgetuserinfo=“getUserInfo“
  4. MFC小笔记:开机自动启动
  5. python selenium 点击加载更多_如何等待页面加载,然后按selenium中的“加载更多”按钮?...
  6. JAVA生成32位随机字符串工具
  7. 对LFW数据库的翻译【1】
  8. 测试用例和缺陷报告模板
  9. C语言除法向上、向下取整
  10. 彻底解决乱码问题(一):为何会出现乱码
  11. C#反射Activator
  12. 知识普及|模拟量、数字量与开关量的区别?
  13. Java学习路线和资料分析
  14. ios 全屏返回手势
  15. sku与spu 概念
  16. 《Generating Question Relevant Captions to Aid Visual Question Answering》(生成问题相关标题,以帮助视觉回答问题)论文解读
  17. P2-前端基础-网页中的实体(转义字符)
  18. 软件测试中如何测试算法?
  19. 威联通NAS提示“拒绝了我们的连接请求”的解决办法
  20. [openstack swift]0 swift介绍

热门文章

  1. YUV和RGB调节色彩公式
  2. 最基本的计算机度量单位是什么意思,计算机常用的度量单位
  3. 设置单行省略的时候在搜狗浏览器里面导致页面布局紊乱
  4. node_注册页面+连接数据库+加密
  5. 论文排版LaTeX学习笔记
  6. 混合开发Ionic+angular快速开发App
  7. 如何使用YouTube视频管理器
  8. 【工控老马】三菱Q系列PLC调试及三菱触摸屏报警使用说明详解
  9. python计算一段时间内的工作日(除周末、除中国节假日、加调休)和所有日期
  10. 盛金公式解一元三次方程_一元三次方程的解法