上一篇我们已经完成了一个初始的scrapy爬虫模板,接下来开始分析我们要爬取的网页结构。
首先按下F12,观察网页结构,发现每个tr标签都在这个table标签下
在这个网页中,我们要获取每个城市的省份或直辖市,还有城市的名称,还有城市所对应的初始链接。
这里先给出代码:
def parse(self, response):
# 获取所有的tr标签
trs = response.xpath("//div[@class='outCont']//tr")
province = None # 先让省份为None,后续对省份赋值
for tr in trs:
tds = tr.xpath(".//td[not(@class)]")
province_id = tds[0]
province_text = province_id.xpath(".//text()").get()
province_text = re.sub(r'\s', "", province_text)
if province_text:
province = province_text # 再给省份赋值
# 不抓取海外的房价信息
if province == "其它":
continue
分析这段代码,我们先获取了包含每一行的城市的tr标签,然后对其进行遍历,获取td中没有class属性的td标签,得到一个列表,然后在获取它的文本,去除多余的空白字符,最后将值赋值为province
接下来获取城市和城市所对应的url地址:
接下来是代码:
city_td = tds[1]
city_links = city_td.xpath(".//a")
for city_link in city_links:
city = city_link.xpath(".//text()").get() # 获取城市名称
city_url = city_link.xpath("./@href").get() # 获取城市链接
这里可以发现他们所对应的城市名称和url地址都在第二个td标签中,
所以这里获取所需要的东西就很简单:
既然我们已经获取了所有城市的基础url,那么我们就可以在这个基础之上构建城市的新房和二手房的链接,上一节已经为大家展现出规律:
这里以城市安庆为例:
‘’‘
安庆的url地址: https://anqing.fang.com/
新房url地址: https://anqing.newhouse.fang.com/house/s/
二手房url地址: https://anqing.esf.fang.com/
其他地方房价的url地址规律都和'安庆' 的一样, 但有一个城市比较特别,那就是我们的首都北京:
北京的新房url地址链接: https://newhouse.fang.com/house/s/
二手房链接:https://esf.fang.com/
’‘’
有了规律之后构建就轻松很多了。
url_moudle = city_url.split(".")
scheme = url_moudle[0]
domain = url_moudle[1]
last = url_moudle[2]
if "bj" in scheme: # 构建北京的新房和二手房的url链接
newhouse_url = "https://newhouse.fang.com/house/s/"
esf_url = "https://esf.fang.com/"
else:
# 构建城市新房链接
newhouse_url = scheme + ".newhouse." + domain + "." + last + "house/s/"
# 构建城市二手房链接
esf_url = scheme + ".esf." + domain + '.' + last
将基础的url用split进行拆分,获取一个列表,然后再按所需的要求进行url的构建。
# 构建生成器,将新房的详细信息传递个下一个函数数获取
yield scrapy.Request(
url=response.urljoin(newhouse_url),
callback=self.parse_newhouse,
meta={"info": (province, city)}
)
# 构建生成器,将二手房信息传递给另一个函数获取
yield scrapy.Request(
url=response.urljoin(esf_url),
callback=self.parse_esf,
meta={"info": (province, city)}
)