爬虫入门—静态网页(链家北京二手房)

1 引言

  • 最近写了一些简单的爬虫,感觉到爬虫这个东西实践大于理论,需要实际操作才能体会更深,写下这篇短文,希望给有需要的同学在爬虫入门的时候一点小小的帮助。
  • 本文适合具备一定Python基础的同学,需要用到包括列表,循环,函数,文件读写等基础知识,没有接触过Python的同学突击了解一下即可,动手为先。

2 环境

  • Python3.6
  • IDE: Pycharm
  • 操作系统:Windows

3 基础知识

本节介绍Requests库和BeautifulSoup库的基本用法,已经有了解的同学可以直接跳过。


我们的目标网页如下图所示,我们想要把红色方框里的数据爬下来,单独整理成一行,这样就形成了每个楼盘一条记录,就方便后续作分析了。


1.png

其实,这些数据都在网页源代码里躺着,我们第一步需要做的得到源代码,然后再去源代码里找数据,想要得到网页源代码,本文介绍使用python的requests库:

  • Requests
    在Chrome浏览器中,适用Ctrl+u快捷键可以看到网页的源代码,我们的目标数据就在那一大串源代码里。日常浏览的时候,我们通过浏览器获得网页的源代码,经浏览器解析和渲染后,就成了我们看到的模样。
    现在我们需要在Python里同样获得源代码,本文使用第三方库Requests,通过以下命令,就可以获得我们需要的源代码了。
# requests.get可以返回一个python response对象
response = requests.get("https://bj.lianjia.com/ershoufang/")

# response对象是二进制的,我们需要通过.text方法将它转化成文本,转化之后就是Ctrl+u看到的样子
response_text = response.text

获得源代码以后,我们要进一步在源代码里找到我们需要的数据,网页的源代码是有一定的结构的,类似

<li class="sellListContent"> 目标数据 </li>

这样的结构是一个个标签,但是我们在上一步获得的源代码是一个超长的字符串,我们需要将字符串重新转化为有结构的模式,这里使用第三方库BeautifulSoup。

  • BeautifulSoup

BeautifulSoup库可以将源代码转化为BeautifulSoup对象,我们需要在BeautifulSoup对象中找到我们的目标标签,然后提取目标数据,代码如下

from bs4 import BeautifulSoup # python3已将BeautifulSoup库集成到bs4中,需要先import

# 将上述文本转化为BeautifulSoup对象,"html.parser"是一种解剖器
bsobj = BeautifulSoup(response_text,"html.parser")
   
# 在BeautifulSoup对象里找到目标内容所在的标签
ul = bsobj.find("ul",{"class":"sellListContent"}) # 这里.find返回找到的第一个标签

# 由于标签是有层级结构的,所以我们可以继续在标签里找,这里.find_all则返回找到的所有符合要求的标签组成的列表
all_li = ul.find_all("li",{"class":"clear"})

基础知识介绍到这里,下面开始实战。

4 开始爬虫

本节定义了几个函数,实现了从标签里提取数据,并拼接成我们需要的格式,然后写入文本文件。下面分别介绍:

  • 函数getdata(),从网页爬取数据
    我们期望实现以下效果:给函数一个网址,函数就返回我们需要的数据,代码如下
import requests
from bs4 import BeautifulSoup

def getdata(url):
    
    # 模拟一个请求头,目的是假装我们是通过浏览器访问的网页
    header = {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36"}
    
    # 通过requests.get可以获得网址为url的网页的返回的一些数据
    response = requests.get(url,headers=header)
    
    # 由于返回的是二进制,需要通过response.text转化为文本
    response_text = response.text
   
    # 将上述文本转化为BeautifulSoup对象,"html.parser"是一种解剖器
    bsobj = BeautifulSoup(response_text,"html.parser")
   
    # 在BeautifulSoup对象里找到目标内容所在的标签
    ul = bsobj.find("ul",{"class":"sellListContent"})
    
    # 再在标签里找到下级标签,返回的是所有标签组成的一个列表(也可以在上一步直接找,不过有可能找到一些包含我们不需要的数据的标签)
    all_li = ul.find_all("li",{"class":"clear"})
    
    housdata = []
    # 由于每一个"li"都是一条记录,我们要循环将"li"里面的内容取出来
    for li in all_li:
        record = ""
        
        # 由于每一个"li"里面又有很多"div","div"里的内容才是我们真正想要的,因此继续找
        all_div = li.find("div",{"class":"info clear"}).find_all("div")
        
        # 将每个"div"里的内容通过.get_text()方法取出来
        for j in all_div:
            j_text = j.get_text().strip().strip("\n") # 两个strip先后去除取出来文本两端的空格和换行符
            # 然后将每个"div"里取出来的文本拼接起来
            record = record + "@" + j_text
        
        # 每个"li"都会返回一个record,即一条记录
        # 将每个record都添加到housdata这个列表里
        housdata.append(record)
    
    # 最后返回整个housdata列表
    return housdata

  定义好这个函数之后,我们每输入一个url,函数就可以返回包括该网页中所有记录的列表了。
  当然,一个页面并不能满足要求,我们的目标是所有网页,因此只需要得到所有网页,然后一个一个喂给getdata函数就可以了,下面定义一个构造网页的函数,我们给该函数一个数字(代表第几页),该函数就返回该页的网址。

  • 函数geturl(),获取页面url
def geturl(num):
    if num ==1 :
        url = r"https://bj.lianjia.com/ershoufang/"
    else:
        url = "https://bj.lianjia.com/ershoufang/pg" + str(num) +"/"
    return url
  • 最后的工作
    最后就是使用我们定义好的函数,然后一页一页爬取,并写入txt文本文件了。
lianjia = open(r"C:\Users\lianjia.txt","a",encoding="utf-8")
for i in range(1, 940):
    url = geturl(i)
    housdata = getdata(url)
    for line in housdata:
        lianjia.write(line + "\n")
    time.sleep(1)
    print(i)
lianjia.close()

转载请注明出处,有任何问题,请联系我的邮箱:oythonhill@163.com

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,132评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,802评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,566评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,858评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,867评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,695评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,064评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,705评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,915评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,677评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,796评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,432评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,041评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,992评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,223评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,185评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,535评论 2 343