用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
總結
以上是生活随笔為你收集整理的用BeautifulSoup来写python爬虫的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python dict sorted 排
- 下一篇: 爬虫基于ADSL动态获取ip