爬虫实战-链家北京房租数据
本篇是对 恋习Python
发布的原创文章《北京房租大涨?6个维度,数万条数据帮你揭穿》中涉及的代码部分的解读。
< 在复现原文代码时,出现了一些报错,在本文中已进行了更改 >
1. 数据获取部分
把目前市场占有率最高的房屋中介公司为目标,来获取北京、上海两大城市的租房信息。
(目标链接:https://bj.lianjia.com/zufang/)
整体思路是:
- 先爬取每个区域的url和名称,跟主url拼接成一个完整的url,循环url列表,依次爬取每个区域的租房信息。
- 再爬每个区域的租房信息时,找到最大的页码,遍历页码,依次爬取每一页的二手房信息。
这里用到的几个爬虫Python包:
- requests: 就是用来请求对链家网进行访问的包
- lxml: 解析网页,用xpath表达式与正则表达式一起来获取网页信息,相比bs4速度更快
1.1 导入包
import requests
import time
import re
from lxml import etree
1.2 获取某市区域的所有链接
headers:请求头
content.xpath:
headers = {
'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.108 Safari/537.36'}
对第一个正则表达式 "//dd[@data-index = '0']//div[@class='option-list']/a/text()"
的解读:
//dd
表示定位到html文本中字段头由<dd
开头。[@data-index = '0']
表示定位到符合data-index = '0'
这个条件的位置。//div[@class='option-list']/a
同理向后搜寻,定位到以<div
开头并且符合class='option-list
这个条件的位置。/text()
表示将上述位置后的文本内容抓取出来。
对第二个正则表达式 "//dd[@data-index = '0']//div[@class='option-list']/a/@href"
的解读:
- 同样的代码解读同上。
/@href
表示在上述位置后,将href
后面的内容抓取出来。
# 获取北京市区域的所有链接
def get_areas(url):
print('start grabing areas')
headers = {
'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.108 Safari/537.36'}
response = requests.get(url, headers=headers)
content = etree.HTML(response.text) # 使用etree来解析html文本
areas = content.xpath("//dd[@data-index = '0']//div[@class='option-list']/a/text()") # content.xpath来获取北京市的各个辖区
areas_link = content.xpath("//dd[@data-index = '0']//div[@class='option-list']/a/@href") # content.xpath来获取北京市的各辖区的链接(部分)
for i in range(1,len(areas)): # 索引0对应的筛选条件是“不限”,即未区分辖区,故跳过
area = areas[i]
area_link = areas_link[i]
link = 'https://bj.lianjia.com' + area_link # 北京市各辖区的第一页
print(link)
print("开始抓取页面")
get_pages(area, link) # 调用get_pages函数
这个 get_areas 函数完成的任务是:
- 获取了北京市各区域第一个页面的链接
- 这个函数的输入是主函数输入的 url
- 最后一个循环中需要调用 get_pages 函数
1.3 通过获取某一区域的页数,来拼接某一页的链接
这