Python爬虫系列-Xpath自如和bs4链家

爬完魔方之后,再接再厉爬取自如和链家,然后...不出意外的又失败了!在向右老师和羽恒大神的拯救下,终于把我从坑里挖了出来。虽然错的也还有点稀里糊涂的,但前事不忘,后事之师。下面把遇到的坑简单说一下。
<h4>xpath找自如</h4>
首先找到自如友家杭州站的地址,http://hz.ziroom.com/z/nl/z2.html
我觉得我也就是这个第一级的网址能找对了...
然后观察网址,找需要的标题,地址和价格

图片.png
下面是我写的程序
...
infos=selector.xpath('div//li[@class="clearfix"]/div/')
list_dict=[]
for info in infos:
    item={} 
    name=info.xpath('div/h3/a/text()')[0] 
    address=info.xpath('div/h4/a/text()')[0]        
    price=info.xpath('p/[@class="price"]/text()')[0]

当时我的逻辑是,在chrome用小箭头找到每个房源的地址,得到class=clearfix这一级,然后向下。然后标题在txt下的“h3”处,地址在“h4”处,价格在另一个标签price处。然后就试着写下来,结果是运行不出来....

大神的诊断:一个是需要请求头伪装,另外就是地址还要取高一级,点选到所有的房源。
还有定位还不够准确,div要定到第二个,所以是div[2]。价格这里,因为二级结构Infos已经定位到价格,所以不要再写class=price这些了,直接用p[1]定位。

#coding:utf-8
import requests
from lxml import etree
import random

url='http://sz.ziroom.com/z/nl/z2.html'
def getReqHeaders():
    """
    功能:随机获取HTTP_User_Agent
    """
    user_agents=[
    "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36"]
    user_agent = random.choice(user_agents)
    req_headers={
    'User-Agent':user_agent
    }
    return req_headers

html=requests.get(url,headers=getReqHeaders()).content
#print(html)
selector=etree.HTML(html)
infos=selector.xpath('//*[@id="houseList"]/li')
#print infos

list_dict=[]
for info in infos:
    item={}
    name=info.xpath('div[2]/h3/a/text()')[0]
    address=info.xpath('div[2]/h4/a/text()')[0]
    price=info.xpath('div[3]/p[1]/text()')[0]
    print name, '      ',address, '      ',price
    #item['name']=name
    #item['address']=address
    #item['price']=price
    #list_dict.append(item)
#print list_dict

在地址向上一栏这里我纠结了很久,因为爬魔方的时候,程工教路,取值就是从clearfix这里取的,用小箭头点选单个公寓列表得到。而自如这里改为id这一级,从所有公寓列表选取。似乎逻辑不同呢,我要再好好想想...

html=requests.get(url).content
selector=etree.HTML(html)
infos=selector.xpath('//div[@class="orgs-room clearfix"]/div[2]')

for info in infos:
    shop_name=info.xpath('p[@class="room-hd"]/a/text()')[0]
    address=info.xpath('p[@class="address"]/text()')[0]
    room_money=info.xpath('p[@class="room-money"]/strong/text()')[0].lstrip('均价:¥').rstrip('/月')
    print shop_name,address,room_money

<h4>BeautifulSoup爬链家</h4>
试着用bs4爬链家,并且加上页数的循环。
其实链家的结构是公认很清晰的,用采集器爬的时候,什么跳转都不用。但是自己一写代码,就马上暴露学习的不足了...

图片.png

自己写的代码,有两个问题,一个是爬出来的都是单一房源,另一个是列表,无法用text找到。 比如写成"address=lj.find_all('div',attrs={'class':'address'}).text"就会报错。

(前略)
url='http://gz.lianjia.com/ershoufang/'
for i in range(1,2):
    i=str(i)
    a=(url+'pg'+i+'/')
    html=requests.get(url=a).text

lista=[]
lj=BeautifulSoup(html, "lxml")
infos=lj.find_all('div',attrs={'class':'info clear'})
for info in infos:
    item={}
    title=lj.find_all('div',attrs={'class':'title'})
    print type(title)
    address=lj.find_all('div',attrs={'class':'address'})
    price=lj.find_all('div',attrs={'class':'totalPrice'})
 (以下略)

下面是向右老师改的代码:

import requests
from bs4 import BeautifulSoup
url='http://bj.lianjia.com/ershoufang/'
for i in range(1,3):
    i=str(i)
    a=(url+'pg'+i+'/')
    print a      
    html=requests.get(url=a).content

    lj=BeautifulSoup(html, "html.parser")
    for info in lj.find_all('div', attrs={'class': 'info clear'}):
        title = info.select('div.title > a')[0].get_text()
        print title
        price = info.select('div.priceInfo > div > span')[0].text
        print price
        loc = info.select('div.flood > div')[0].text
        print loc

原因是,一个是没有把爬页数和下面的每页信息形成嵌套关系,所以爬出来的结果都是一样的;第二个还是网页结构没把握好,"class:info clear"这个二级结构倒是找到了,但是向右老师建议下面应该用select,find找到的是一类标签,用来定位比较复杂。select的好处,就是可以一层一层的找到标签。
比如总价'div.priceInfo > div > span'这里,也可以写成'div.priceinfo > div.totalPrice > span',span没有属性。
这样就比attr要清楚很多。

这个周末总算把两个网站结构又弄清楚了(虽然80%都是别人的功劳!)。另外看了天善智能邱祐玮的爬虫视频。看视频的时候觉得好简单啊,自己做的时候怎么就那么复杂!
第二级结构该取哪一级,还要好好弄明白。
第三级结构的定位,每次的排列组合,搞得我都没信心了,还是人品+技术问题,要练习再练习!

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

推荐阅读更多精彩内容