python爬取网站数据(含代码和讲解)

提示:本次爬取是利用xpath进行,按文章的顺序走就OK的;

文章目录

前言

一、数据采集的准备

1.观察url规律

2.设定爬取位置和路径(xpath)

二、数据采集

1. 建立存放数据的dataframe

2. 开始爬取

3. 把数据导出成csv表格

总结


前言

这次爬取的网站是房天下网站;

其中包含很多楼盘信息:https://newhouse.fang.com/house/s/b81-b91/

我在网站上进行了一步筛选,即选取北京及北京周边的房源,各位要是想爬取其他城市的房源信息也很简单,改一下url信息即可。

一、数据采集的准备

1.观察url规律

观察到北京及周边地区的房源有很多网页,翻几页就能发现url的规律:

网址就是:https://newhouse.fang.com/house/s/ + b81-b9X + / ;其中X是页码

利用for循环遍历所有网页:

for i in range(33): # 每页20个小区,共648个小区
    url = 'https://newhouse.fang.com/house/s/b81-b9' + str(i+1) + '/'

pip 安装fake_useragent库:

fake-useragent可以伪装生成headers请求头中的User Agent值,将爬虫伪装成浏览器正常操作。

!pip install fake_useragent

导入接下来会用到的包:

## 导包
from lxml import etree
import requests
from fake_useragent import UserAgent
import pandas as pd
import random
import time
import csv
设置请求参数:需要大家替换的有’cookie’和’referer’两项的值:

‘cookie’:每次访问网站服务器的时候,服务器都会在本地设置cookie,表明访问者的身份。记得每次使用时,都要按照固定方法人工填入一个 cookie。

‘referer’:请求参数,标识请求是从哪个页面过来的。

# 设置请求头参数:User-Agent, cookie, referer
headers = {
    'User-Agent' : UserAgent().random,
    'cookie' : "global_cookie=kxyzkfz09n3hnn14le9z39b9g3ol3wgikwn; city=www; city.sig=OGYSb1kOr8YVFH0wBEXukpoi1DeOqwvdseB7aTrJ-zE; __utmz=147393320.1664372701.10.4.utmcsr=mp.csdn.net|utmccn=(referral)|utmcmd=referral|utmcct=/mp_blog/creation/editor; csrfToken=KUlWFFT_pcJiH1yo3qPmzIc_; g_sourcepage=xf_lp^lb_pc'; __utmc=147393320; unique_cookie=U_bystp5cfehunxkbjybklkryt62fl8mfox4z*3; __utma=147393320.97036532.1606372168.1664431058.1664433514.14; __utmt_t0=1; __utmt_t1=1; __utmt_t2=1; __utmt_t3=1; __utmt_t4=1; __utmb=147393320.5.10.1664433514",
    # 设置从何处跳转过来
    'referer': 'https://newhouse.fang.com/house/s/b81-b91/'
}

具体更改方法请见链接:

【腾讯文档】'cookie’和 'referer’的更改方法:
https://docs.qq.com/doc/DR2RzUkJTQXJ5ZGt6

只能走链接了,一直审核不过555~

2.设定爬取位置和路径(xpath)

因为爬取数据主要依托于’目标数据所在位置的确定’,所以一定先要搞清楚目标数据的位置(位于div的哪一块);

先发送请求:

url = 'https://newhouse.fang.com/house/s/b81-b91/'# 首页网址URL
page_text = requests.get(url=url, headers=headers).text# 请求发送
tree = etree.HTML(page_text)#数据解析

我想爬取的数据主要就是:楼盘名称、评论数、房屋面积、详细地址、所在区域、均价 5项数据。

代码已经贴在下面了,具体方法描述还是走个链接:

【腾讯文档】获取具体爬取位置的讲解
https://docs.qq.com/doc/DR3BFRW1lVGFRU0Na

# 小区名称
name = [i.strip() for i in tree.xpath("//div[@class='nlcd_name']/a/text()")]
print(name)
print(len(name))

# 评论数
commentCounts = tree.xpath("//span[@class='value_num']/text()")
print(commentCounts)
print(len(commentCounts))

# 房屋面积
buildingarea = [i.strip() for i in tree.xpath("//div[@class='house_type clearfix']/text()")]
print(buildingarea)
print(len(buildingarea))

# 详细地址
detailAddress = tree.xpath("//div[@class='address']/a/@title")
print(detailAddress)
print(len(detailAddress))

# 所在区
district = [i.strip() for i in tree.xpath("//div[@class='address']//span[@class='sngrey']/text()")]
print(district)
print(len(district))

# 均价
num = tree.xpath("//div[@class='nlc_details']/div[@class='nhouse_price']/span/text() | //div[@class='nlc_details']/div[@class='nhouse_price']/i/text()")
unit = tree.xpath("//div[@class='nlc_details']/div[@class='nhouse_price']/em/text()")
price = [i+j for i,j in zip(num, unit)]
print(price)
print(len(price))

此时采集到的数据还包含着:[]方括号、—横杠、“平米”等符号或者单位,所以要对数据进行简单的split处理,把真正需要的数据提取出来:

# 评论数处理
commentCounts = [int(i.split('(')[1].split('条')[0]) for i in commentCounts]
print(commentCounts)

# 详细地址处理
detailAddress = [i.split(']')[1] for i in detailAddress]
print(detailAddress)

# 所在区字段处理
district = [i.split('[')[1].split(']')[0] for i in district]
print(district)

# 房屋面积处理
t = []
for i in buildingarea:
    if i != '/' and i != '':
        t.append(i.split('—')[1].split('平米')[0])
print(t)
print(len(t))

二、数据采集

1. 建立存放数据的dataframe

df = pd.DataFrame(columns = ['小区名称', '详细地址', '所在区', '均价', '评论数'])
df

2. 开始爬取

这里图方便就只爬取了前10页,因为后面的房源就经常少信息,要么没有面积信息,要么没有所在区域。

for k in range(10): 
    url = 'https://newhouse.fang.com/house/s/b81-b9' + str(k+1) + '/' 
    page_text = requests.get(url=url, headers=headers).text #请求发送
    tree = etree.HTML(page_text) #数据解析

    # 小区名称
    name = [i.strip() for i in tree.xpath("//div[@class='nlcd_name']/a/text()")]
    # 评论数
    commentCounts = tree.xpath("//span[@class='value_num']/text()")
    # 详细地址
    detailAddress = tree.xpath("//div[@class='address']/a/@title")
    # 所在区
    district = [i.strip() for i in tree.xpath("//div[@class='address']//text()")]
    # 均价
    num = tree.xpath("//div[@class='nlc_details']/div[@class='nhouse_price']/span/text() | //div[@class='nlc_details']/div[@class='nhouse_price']/i/text()")
    unit = tree.xpath("//div[@class='nlc_details']/div[@class='nhouse_price']/em/text()")
    price = [i+j for i,j in zip(num, unit)]

    #评论数处理
    commentCounts = [int(i.split('(')[1].split('条')[0]) for i in commentCounts]
    #详细地址处理
    tmp1 = []
    for i in detailAddress:
        if ']' in i:
            tmp1.append(i.split(']')[1])
            continue
        tmp1.append(i)
    detailAddress = tmp1
    #所在区处理
    tmp2 = []
    for i in district:
        if ']' in i and '[' in i:
            tmp2.append(i.split(']')[0].split('[')[1])
    district = tmp2
         

    dic = {'小区名称':name, '详细地址':detailAddress, '所在区':district, '均价':price, '评论数':commentCounts}
    df2 = pd.DataFrame(dic)
    df = pd.concat([df,df2], axis=0)
    print('第{}页爬取成功, 共{}条数据'.format(k+1, len(df2)))
    
print('全部数据爬取成功')

3. 把数据导出成csv表格

df.to_csv('北京小区数据信息.csv',index=None)

总结

说实话,本文使用的爬取方法简单而且信息正确,但是存在一些不足,比如面对楼盘的部分信息空缺时,就无法按照null来采集,而是会报错,所以我现有的解决方法就是在循环中人工去设置条件,跳过空缺信息。

我会继续优化这个方法的~

关于Python技术储备

学好 Python 不论是就业还是做副业赚钱都不错,但要学会 Python 还是要有一个学习规划。最后大家分享一份全套的 Python 学习资料,给那些想学习 Python 的小伙伴们一点帮助!

包括:Python激活码+安装包、Python web开发,Python爬虫,Python数据分析,Python自动化测试学习等教程。带你从零基础系统性的学好Python!

👉[[CSDN大礼包:《python安装包&全套学习资料》免费分享]]安全链接,放心点击

在这里插入图片描述

一、Python大礼包

Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
在这里插入图片描述

二、 Python电子书

在这里插入图片描述

三、入门学习视频

四、 Python爬虫秘笈

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。
在这里插入图片描述

五、 数据分析全套资源

在这里插入图片描述

六、python副业兼职与全职路线

在这里插入图片描述
上述这份完整版的Python全套学习资料已经上传CSDN官方,如果需要可以微信扫描下方CSDN官方认证二维码 即可领取

👉[[CSDN大礼包:《python安装包&全套学习资料》免费分享]]安全链接,放心点击

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当然可以!Python中最常用的库之一就是BeautifulSoup,它是一个用于解析HTML和XML文件的库,非常适合爬取网页数据。下面我将给你一个简单的例子来讲解如何使用BeautifulSoup进行爬取。 首先,你需要安装BeautifulSoup库。你可以使用以下命令来安装: ``` pip install beautifulsoup4 ``` 安装完成后,你就可以在Python脚本中导入BeautifulSoup了: ```python from bs4 import BeautifulSoup ``` 接下来,你需要获取网页的内容。你可以使用Python的requests库来发送HTTP请求并获取网页的HTML内容。以下是一个示例: ```python import requests # 发送HTTP请求获取网页内容 response = requests.get('http://example.com') html_content = response.text # 创建BeautifulSoup对象,并指定解析器 soup = BeautifulSoup(html_content, 'html.parser') ``` 现在,你已经成功获取了网页的内容并创建了BeautifulSoup对象。接下来,你可以使用BeautifulSoup提供的方法和属性来提取所需的数据。 例如,如果你想找到所有的链接,你可以使用`find_all`方法,并指定标签名称为`a`: ```python links = soup.find_all('a') for link in links: print(link['href']) ``` 如果你只想找到第一个符合条件的元素,可以使用`find`方法: ```python title = soup.find('h1') print(title.text) ``` 除了使用标签名称,你还可以使用CSS选择器来查找元素。例如,如果你想找到所有class为"content"的div元素,可以使用以下代码: ```python divs = soup.select('div.content') for div in divs: print(div.text) ``` 以上就是使用BeautifulSoup进行简单的网页爬取的基本步骤和示例。希望能帮助到你!如果你还有其他问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值