目标
爬取小猪短租网北京地区短租房13页的信息,包括标题、地址、价格、房东名称、房东性别和房东头像的链接。
爬虫思路分析
(1)手动浏览小猪短租网北京地区(http://bj.xiaozhu.com/),往后翻页查看url地址构造,发现第2-4页的url地址分别是:
http://bj.xiaozhu.com/search-duanzufang-p2-0/
http://bj.xiaozhu.com/search-duanzufang-p3-0/
http://bj.xiaozhu.com/search-duanzufang-p4-0/
不难看出url地址的规律,将p后面的数字改为1(http://bj.xiaozhu.com/search-duanzufang-p1-0/),发现可以正常打开第一页,因此,只要修改p后面的数字就可以构造出待爬取的13页url。
image(2)本次要爬取的信息在详细页面,因此需要先爬取详细页面的网址链接,进而爬取需要的数据。
右击第一个房源图片,点击审查元素,可以找到第一个房源详细页面的链接是"http://bj.xiaozhu.com/fangzi/31059118103.html"。老办法,右击该链接,选择Copy > Copy selector ,得到selector选择器的目标“#page_list > ul > li:nth-child(1) > a”。同样的办法,得到第二个房源的链接selector选择器的目标是"#page_list > ul > li:nth-child(2) > a",第三个是"#page_list > ul > li:nth-child(3) > a",我们可以使用“#page_list > ul > li > a”得到所有的超链接列表,再循环遍历得到每一个房源的链接。
范例代码如下:
import requests
from bs4 import BeautifulSoup
import time
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 \
(KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'}
def judgementSex(class_name):
#判断性别
if class_name == ['member_ico']:
return '女'
else:
return '男'
pass
def getLinks(url):
#获取详细页URL
r = requests.get(url, headers=headers)
soup = BeautifulSoup(r.text, 'lxml')
links = soup.select('#page_list > ul > li > a') #links为url列表(注意>符号两边都有空格,没有空格会出错)
for link in links:
href = link.get('href')
getInfo(href) #循环出的url依次调用getInfo()函数获取房源详细信息
pass
def getInfo(url):
#获取房源详细信息
r = requests.get(url, headers=headers)
soup = BeautifulSoup(r.text, 'lxml')
titles = soup.select('div.pho_info > h4')
addresses = soup.select('span.pr5')
prices = soup.select('#pricePart > div.day_l > span')
imgs = soup.select('#floatRightBox > div.js_box.clearfix > div.member_pic > a > img')
names = soup.select('#floatRightBox > div.js_box.clearfix > div.w_240 > h6 > a')
sexs = soup.select('#floatRightBox > div.js_box.clearfix > div.member_pic > div')
for title,address,price,img,name,sex in zip(titles,addresses,prices,imgs,names,sexs):
data = {
'title':title.get_text().strip(),
'address':address.get_text().strip(),
'price':price.get_text(),
'img':img.get('src'),
'name':name.get_text(),
'sex':judgementSex(sex.get('class')),
}
print(data)
pass
#主函数
if __name__ == '__main__':
#构造多页URL
urls = ["http://bj.xiaozhu.com/search-duanzufang-p{}-0/".format(number) for number in range(1,14)]
for single_url in urls:
print('正在爬取'+single_url)
getLinks(single_url) #循环调用getLinks()函数
time.sleep(2)
image
网友评论