python3 爬虫之爬取链家二手房

软件设计 2017-05-03

前言

作为一个转行人士,刚进入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先了:

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 i 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
import re

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

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模块里面的方法得到:

from bs4 import BeautifulSoup

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

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].text        print(title)

得到结果

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

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文档里面:

def pandas_to_xlsx(info):
    pd_look = pd.DataFrame(info)
    pd_look.to_excel('链家二手房.xlsx',sheet_name='链家二手房')

        

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

相关推荐