这段时间看了唐松老师写的《python网络爬虫从入门到实践》,学到许多网络爬虫方面的知识,也以书里的实践项目进行练手。
我的第一篇的网络爬虫心得,就以书里第五章的实践:爬虫实践:房屋价格数据,参考书里的内容进行练手。
实践项目是获取安居客网站上北京二手房的数据。本项目需要获取前10页二手房源的名称、价格、几房几厅、大小、建造年份、联系人、地址、标签。网页地址为:http://beijing.anjuke.com/sale/。
这里我把北京改为了泉州丰泽区。
第一步,网站分析。
和书里介绍的内容一样,网站一页有60个二手房信息,翻页有明显的规则,对于翻页,我写了一个获得页面地址的列表。
link = []
for i in range(1,11):
link.append('https://quanzhou.anjuke.com/sale/fengzequ/p'+str(i)+'/#filtersort')
二手房信息的结构,是以每一套房进行展开,包含了房源的名称、价格、几房几厅、大小、建造年份、联系人、地址等相关内容。这些内容对应的标签为:
每一套房源的标签: li class=“list-item over-bg” data-from=""
房源的名称:div class=“house-title” 下的a标签
几房几厅: div class="details-item"下的span
面积大小:div class="details-item"的contents[3]
层高:div class="details-item"的contents[5]
建站年份:div class="details-item"的contents[7]
价格:span,class=“price-det”
单价:span,class=“unit-price”
地址:span,class=“comm-address”
有了这些内容对应的标签,就可以利用BeautifulSoup库的find来找到对应的内容。
第二步,爬虫代码编写
首先,导入requests和BeautifulSoup库
import requests
from bs4 import BeautifulSoup
接着,定制请求头,利用for循环生成每个页面的链接
header = {'user-agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36'}
link = []
for i in range(1,11):
link.append('https://quanzhou.anjuke.com/sale/fengzequ/p'+str(i)+'/#filtersort')
定制requests请求头,利用network找到Hearders。
在定制requests请求头要注意,user-agent后的内容直接从网页拷贝出来会有一个空格,需要去掉,不然会出错。
接下来,爬取房源的数据
要爬取10页的房源数据,需要做一个循环
for n in range(10):
r = requests.get(link[n],headers=header,timeout=10)
soup = BeautifulSoup(r.text,'lxml')
取每一页的60个房源数据
h_list = soup.find_all('li',class_='list-item')
for house in h_list:
name = house.find('div',class_='house-title').a.text.strip()
room = house.find('div',class_='details-item').span.text.strip()
area = house.find('div',class_='details-item').contents[3].text.strip()
hight = house.find('div',class_='details-item').contents[5].text.strip()
price = house.find('span',class_='price-det').text.strip()
pp = house.find('span',class_='unit-price').text.strip()
address = house.find('span',class_='comm-address').text.strip()
output = '\t'.join([name,room,area,hight,price,pp,address])
with open(r'd:\house.txt','a+',encoding='utf-8') as f:
f.write(output)
这里要注意的是,文件写入是用gbk码写入,爬取数据的有些符号会导致出错,比如空格、平方。需要修改写文件用utf-8格式。
最后放上完整的代码
import requests
from bs4 import BeautifulSoup
header = {'user-agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36'}
link = []
for i in range(1,11):
link.append('https://quanzhou.anjuke.com/sale/fengzequ/p'+str(i)+'/#filtersort')
for n in range(10):
r = requests.get(link[n],headers=header,timeout=10)
soup = BeautifulSoup(r.text,'lxml')
h_list = soup.find_all('li',class_='list-item')
for house in h_list:
name = house.find('div',class_='house-title').a.text.strip()
room = house.find('div',class_='details-item').span.text.strip()
area = house.find('div',class_='details-item').contents[3].text.strip()
hight = house.find('div',class_='details-item').contents[5].text.strip()
price = house.find('span',class_='price-det').text.strip()
pp = house.find('span',class_='unit-price').text.strip()
address = house.find('span',class_='comm-address').text.strip()
output = '\t'.join([name,room,area,hight,price,pp,address])
with open(r'd:\house.txt','a+',encoding='utf-8') as f:
f.write(output)
通过这个练手实践,基本上能掌握静态页面的爬取。