用BeautifulSoup来写python爬虫

爬虫定位网站:http://www.yanglao.com.cn/

代码很简单,单线程,可优化的地方很多:

如下:

# -*- coding: utf-8 -*-
"""
Created on Wed Sep 27 16:37:57 2017

@author: ESRI
"""

from bs4 import BeautifulSoup as bs
import urllib
import csv
import requests
import re
import time

col=['名称','所在地区','机构类型','收住对象','收费区间','地址']
myfile=open('E:\\example.csv','w',newline='')
mywriter=csv.writer(myfile)
mywriter.writerow(col)

startreq=urllib.request.urlopen('http://www.yanglao.com.cn/city')  #进入爬取第一页
soup=bs(startreq,'lxml')
citylinklist=soup.find_all('div',class_='citylist')[0].find_all('a',href=True)   #获取城市名称
k=['所在地区','机构类型','收住对象','收费区间']    #定义字段
for city in citylinklist:     #按城市名称循环
    mainurl='http://www.yanglao.com.cn'+city['href']
    print(mainurl)
    req=urllib.request.urlopen(mainurl)
    print(req)
    soup=bs(req,'lxml')
    #print(soup)
    try:finalpage=int(soup.find_all('ul',id='yw1')[0].find_all('a')[-1]['href'].split('_')[-1])  #查找分页
    except:finalpage=1
   
    i=1


    while(i<=finalpage):   

        url=mainurl+'_'+str(i)
        try:req=urllib.request.urlopen(url)
        except:print('lol')
        soup=bs(req,'lxml')
        linklist=soup.find_all('li',class_='rest-item')
        for item in linklist:
            row=[]
            temp=item.find_all('a',href=True)[1]
            row.append(temp['title'])
            
            s0=temp['href']
            s1='http://www.yanglao.com.cn'
            nexturl=s1+s0

            req1=urllib.request.urlopen(nexturl)
            soup1=bs(req1,'lxml')

            baseinfo=soup1.find_all('div',class_='base-info')[0]
            emlist=list(map(lambda x:x.get_text()[:-1],baseinfo.find_all('em')))
            lilist=baseinfo.find_all('li')
            for name in k:
                if name in emlist:

                    pos=emlist.index(name)
                    row.append(lilist[pos].get_text()[5:])
                else:
                    row.append('')

            #try:row.append(soup1.find_all('div',class_='contact-info')[0].find_all('li')[1].get_text()[11:])
            #except:row.append('')

            row[3]=row[3].replace('\xa0',',').strip(' ').split(' ')[-1][:-1]
            row[1]=row[1].replace(' ','').replace('\r\n','')

            try:mywriter.writerow(row)
            except:print('lol')

        i=i+1

myfile.close()


最终结果如下(部分结果):

名称,所在地区,机构类型,收住对象,收费区间,地址
铁东区馨家园老年公寓,辽宁-鞍山市-铁东区,老年公寓,"自理,半自理/介助,不能自理/介护",1200 - 5000
鞍山伯伦科技有限公司,辽宁-鞍山市-,其他,自理,2000 - 3600
 鞍山康乐护理院,辽宁-鞍山市-铁西区,护理院,"自理,半自理/介助,不能自理/介护,特护",1000 - 2000
大吉山庄老年公寓,辽宁-鞍山市-千山区,老年公寓,"自理,半自理/介助,不能自理/介护,特护",750 - 2000
乐呵呵老年公寓,辽宁-鞍山市-铁西区,老年公寓,"自理,半自理/介助",600 - 2400
鞍山市天柱养老院,辽宁-鞍山市-铁东区,养老院,"自理,不能自理/介护,特护",700 - 1000
 鞍山康乐老年公寓,辽宁-鞍山市-铁西区,老年公寓,"自理,半自理/介助,不能自理/介护,特护",800 - 1500
鞍山市立山区北铸祥乐园养老院,辽宁-鞍山市-立山区,养老院,"自理,半自理/介助",900 - 1600
和和养老院,辽宁-鞍山市-立山区,养老院,"自理,半自理/介助,不能自理/介护,特护",1000 - 1600
长乐养老院,辽宁-鞍山市-铁东区,养老院,"自理,半自理/介助,不能自理/介护,特护",1500 - 2000
鞍山市享乐居养老院,辽宁-鞍山市-铁东区,养老院,"自理,半自理/介助,不能自理/介护,特护",1000 - 1600
世外桃源老年公寓,辽宁-鞍山市-千山区,老年公寓,自理,1000 - 2000
鞍山祥颐园老年公寓,辽宁-鞍山市-铁东区,老年公寓,"半自理/介助,不能自理/介护,特护",5500 - 7250
怡居养老院,辽宁-鞍山市-千山区,养老院,自理,500 - 1500
福来居养老院,辽宁-鞍山市-千山区,养老院,自理,600 - 1000
鞍山市东方老年公寓,辽宁-鞍山市-千山区,老年公寓,自理,500 - 1000
鞍山市红祥回族养老院,辽宁-鞍山市-千山区,养老院,"自理,半自理/介助",700 - 1500
辽宁省鞍山市岫岩县朝阳乡敬老院,辽宁-鞍山市-岫岩满族自治县,敬老院,自理,500 - 1000
辽宁省鞍山市台安县民政局敬老院,辽宁-鞍山市-台安县,敬老院,自理,500 - 1000
辽宁省鞍山市千山区唐家房镇敬老院,辽宁-鞍山市-千山区,敬老院,自理,500 - 1000
辽宁省鞍山市台安县高力房镇敬老院,辽宁-鞍山市-台安县,敬老院,自理,500 - 1000
辽宁省鞍山市台安县黄沙镇敬老院,辽宁-鞍山市-台安县,敬老院,自理,500 - 1000
辽宁省鞍山市千山区宋三台子镇敬老院,辽宁-鞍山市-千山区,敬老院,自理,500 - 1000
辽宁省鞍山市立山区双山福利院,辽宁-鞍山市-立山区,福利院,自理,500 - 1000
辽宁省鞍山市千山区泰和慈善养老院,辽宁-鞍山市-千山区,养老院,自理,500 - 1000


你可能感兴趣的:(Python爬虫)