如何让别人看到自己做的网站,如何在百度里做推广网站,在线代理浏览网站免费,免费建网站入驻简介#xff1a;个人学习分享#xff0c;如有错误#xff0c;欢迎批评指正 任务#xff1a;从房天下网中爬取小区名称、地址、价格和联系电话
目标网页地址#xff1a;https://newhouse.fang.com/house/s/
一、思路和过程
目标网页具体内容如下#xff1a; … 简介个人学习分享如有错误欢迎批评指正 任务从房天下网中爬取小区名称、地址、价格和联系电话
目标网页地址https://newhouse.fang.com/house/s/
一、思路和过程
目标网页具体内容如下
我们的任务是将上图中小区名称、地址、价格和联系电话对应爬下来。
1.定义目标URL
由于网页普遍具有反爬程序不加修饰的直接访问网页可能会失败所以第一步学会伪装自己。 如何伪装自己呢可以通过找到正常访问网页时的访问状态将自己的这次爬虫模拟成一次正常访问网页因此我们的目标是找到正常访问网页时的User-Agent。User Agent中文名为用户代理(简称 UA它是一个特殊字符串头使得服务器能够识别客户使用的操作系统及版本、CPU 类型、浏览器及版本、浏览器渲染引擎、浏览器语言、浏览器插件等)。User-Agent就是你访问网页的身份证明。具体操作如下
首先打开目标/任意网页然后点击鼠标右键后选择检查打开网页的HTML 页面。
在HTML 页面里面依次点击网络然后任意点一条网络请求如果没有显示任何网络请求可以点击网页左上角的刷新然后选择标头下拉列表找到User-AgentUser-Agent后面那段内容就是我们用来伪装自己的身份码。 2.发送GET请求获取网页内容
通过上面的步骤我们获得了 url ‘https://newhouse.fang.com/house/s/’
User-Agent:‘Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36 Edg/126.0.0.0’
接下来发起网页访问请求代码如下
import requests # 引入requests库用于发送HTTP请求
from lxml import etree # 引入lxml库中的etree模块用于解析HTML文档# 定义目标URL即要爬取的网页地址
url https://newhouse.fang.com/house/s/# 定义HTTP请求头其中包括User-Agent信息用于伪装成浏览器进行访问
headers {User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36 Edg/126.0.0.0
}# 发送GET请求获取网页内容并将响应内容存储在resp变量中
resp requests.get(url, headersheaders)
# 设置响应内容的编码格式为utf-8确保中文字符正常显示
resq.encoding utf-8
# 打印响应内容检查获取到的HTML文本
print(resp.text)查看print结果我们发现成功获得了网页相关的html表达 3.分析网页内容
接下来对html进行解析获得我们目标内容。 这里我们需要借助工具xpath来辅助内容解析xpath安装教程
安装成功后按CtrlShiftAlt 启动 xpath网页上方出现如下图所示框 找到目标内容方法 例我们的目标是找到小区名字在html中的位置。点击如下图左边标记1该命令的含义是在网页中选择一个元素以进行检查即当你把鼠标放在网页的某一位置下面也会自动定位到html中该内容所在位置如图所示把鼠标放在北京城建·星誉BEIJING2下面显示小区名在html中所在位置3。
明确目标内容的位置。具体的如下图所示小区名北京城建·星誉BEIJING它位于div classnlcd_name中的a里面。 因此我们可以通过这个层层关系来找到目标所有小区名借助刚才安装的工具xpath,下面一步步演示层层查找过程。 首先在query中添加//div[class“nlcd_name”]可以发现右边的results将所有小区的名字返回了。 其次加上筛选条件a得
同理query中添加//div[class“nlcd_name”]可以发现右边的results将所有小区的地址返回了。
同理query中添加//div[class“nhouse_price”]可以发现右边的results将所有小区的价格返回了。
同理query中添加//div[class“tel”]/p/text()可以发现右边的results将所有小区的联系方式返回了。 但是我们发现上面只能取到单页的内容而整个网页如下有很多页。 对于上述问题我们通过对比下图情况发现url地址不同的页码的url仅仅换了最后一个数字数字即对应页码。 因此进一步添加一个for循环来取得所有页的url地址代码如下
for i in range(4):# 构建每一页的URLurl fhttps://newhouse.fang.com/house/s/b9{i}/# 发送GET请求获取网页内容并将响应内容存储在resq变量中resq requests.get(url, headersheaders)# 设置响应内容的编码格式为utf-8确保中文字符正常显示resq.encoding utf-8# 打印响应内容检查获取到的HTML文本print(resq.text)因此通过xpath的可视化辅助得上面地址 //div[classnlcd_name]/a可以获取小区名称//div[classaddress]/a/title可以获取小区地址//div[classnhouse_price可以获取小区价格//div[classtel]/p/text()可以获取小区联系电话。
4.获取目标数据
上一步得到了目标数据的地址接下来就是分别获得到目标数据代码如下 # 使用etree.HTML方法将HTML文本解析为一个HTML文档对象e etree.HTML(resq.text)# 使用XPath语法从HTML文档中提取出小区名称并去除字符串前后的空白字符names [n.strip() for n in e.xpath(//div[classnlcd_name]/a/text())]# 使用XPath语法从HTML文档中提取出小区地址addreses e.xpath(//div[classaddress]/a/title)# 使用XPath语法从HTML文档中提取出小区价格并去除多余的空白字符price [pr.xpath(string(.)).strip() for pr in e.xpath(//div[classnhouse_price])]# 使用XPath语法从HTML文档中提取出联系电话tel e.xpath(//div[classtel]/p/text())5.保存数据
存为一个txt文件
with open(fangtianxia.txt, w, encodingutf-8) as f:# 使用zip函数将名称、地址、价格、电话数据组合在一起逐行写入文件for na, ad, pr, te in zip(names, addreses, price, tel):# 写入格式为红球号码xxx 蓝球号码xxxf.write(f姓名:{na} 地址:{ad} 价格:{pr} 电话:{te}\n)
二、完整python代码
import requests # 引入requests库用于发送HTTP请求
from lxml import etree # 引入lxml库中的etree模块用于解析HTML文档
import pandas as pd # 引入pandas库用于处理和存储数据# 定义HTTP请求头其中包括User-Agent信息用于伪装成浏览器进行访问
headers {User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36 Edg/126.0.0.0
}# 初始化一个空列表用于存储爬取的数据
data []# 循环遍历4个页面每个页面的URL末尾数字依次递增
for i in range(4):# 构建每一页的URLurl fhttps://newhouse.fang.com/house/s/b9{i}/# 发送GET请求获取网页内容并将响应内容存储在resq变量中resq requests.get(url, headersheaders)# 设置响应内容的编码格式为utf-8确保中文字符正常显示resq.encoding utf-8# 打印响应内容检查获取到的HTML文本print(resq.text)# 使用etree.HTML方法将HTML文本解析为一个HTML文档对象e etree.HTML(resq.text)# 使用XPath语法从HTML文档中提取出小区名称并去除字符串前后的空白字符names [n.strip() for n in e.xpath(//div[classnlcd_name]/a/text())]# 使用XPath语法从HTML文档中提取出小区地址addreses e.xpath(//div[classaddress]/a/title)# 使用XPath语法从HTML文档中提取出小区价格并去除多余的空白字符price [pr.xpath(string(.)).strip() for pr in e.xpath(//div[classnhouse_price])]# 使用XPath语法从HTML文档中提取出联系电话tel e.xpath(//div[classtel]/p/text())with open(fangtianxia.txt, w, encodingutf-8) as f:# 使用zip函数将名称、地址、价格、电话数据组合在一起逐行写入文件for na, ad, pr, te in zip(names, addreses, price, tel):# 写入格式为红球号码xxx 蓝球号码xxxf.write(f姓名:{na} 地址:{ad} 价格:{pr} 电话:{te}\n)
结~~~