首页 > 自学爬虫项目(一)

一人之下第357解析,自学爬虫项目(一)

互联网 2021-05-07 08:17:00
引言

本人是只有python语言基础的小白,进入大学前从未接触过编程知识,学习的专业也与编程无关。机缘巧合之下,有幸接触到编程,对其产生浓厚的兴趣,并开始学习。

此文旨在记录生活,总结心得,若有不足之处,欢迎批评指正。

文章目录 引言一、明确目标二、分析过程三、代码实现四、代码整合五、更多

一、明确目标

用多协程爬取安客居前十页的二手房源的名称,价格,几房几厅,大小,建造年份,联系人,地址。

二、分析过程

1. 首先打开安客居的网站

安客居的url:https://beijing.anjuke.com/sale/

进入网站后按F12进入开发者模式,在network中的Doc中的第0个文件可以看到我们想要的信息都在网页的html中,所以我们可以直接点击开发者框左上角的一个小箭头,来查找我们需要的信息的标签。在这里插入图片描述 我们需要的每一个信息的标签都可以通过以下方式获取 在这里插入图片描述

2. 下面接着分析网址

url:https://beijing.anjuke.com/sale/

不难看出,beijing是代表二手房源所在城市,但是我们还需要获取前十页的网页数据,接下来就点开下一页网址看看有无规律可循

第二页:https://beijing.anjuke.com/sale/p2/ 第三页:https://beijing.anjuke.com/sale/p3/ 第四页:https://beijing.anjuke.com/sale/p4/

通过观察前四页,发先在原本的网址上多了一个p2,p3,p4,可想而知p就是pag的意思,数字则代表相应页码

若想获取前十页数据则需要在加入一个循环便能做到,接下来便是代码实现

三、代码实现

首先第一步将我们上面需要用到的模块导入

from gevent import monkeymonkey.patch_all()#让程序变成异步模式。import random,csv,gevent,time,requestsfrom bs4 import BeautifulSoupfrom fake_useragent import UserAgentfrom gevent.queue import Queue

根据前面分析网址规律,用for循环构造出前十页的网址,并将这些网址放进队列

work = Queue()# 创建队列对象,并赋值给work。for pag in range(10):# 利用循环将前十页的网址获取到url_list = 'https://fuzhoushi.anjuke.com/sale/p'+str(pag)work.put_nowait(url_list) # 把构造好的网址用put_nowait方法添加进列表里

定义一个爬取网页的函数,用开发者选项里的小箭头依次找到二手房源的名称,价格,几房几厅,大小,建造年份,联系人,地址的标签,代码实现如下:

def House_Spider():# 定义House_Spider函数house_items = []# 创建一个空列表,到时候用来装各个信息pagnum = 0# 页码while not work.empty():# 当列表不是空的时候,执行下面的程序pagnum += 1print('正在爬取第{}页数据'.format(pagnum))# 显示正在爬取的页码url = work.get_nowait()headers= {'User-Agent':str(UserAgent().random)}# 随机获取请求头res = requests.get(url,headers=headers)# 获取网页源代码bs =BeautifulSoup(res.text,'html.parser')# 解析网页源码数据items = bs.find_all('div',tongji_tag="fcpc_ersflist_gzcount")# 提取每一个房源的全部信息for item in items:# 遍历循环items得到每个房源信息title = item.find('h3')['title']# 房源标题price = item.find('p',class_="property-price-total").text# 二手房价格room_num = item.find('p',class_="property-content-info-text property-content-info-attribute").text# 房子型号,即几室几厅area = item.find('div',class_="property-content-info").text.strip()[40:50]# 房子面积house_age = item.find('div',class_="property-content-info").text.strip()[-7:-1]#房子建造年份if house_age[-2:-1] != '年':house_age = '无'else:passcall_name = item.find('span',class_="property-extra-text").text# 联系人house_addr = item.find('div',class_="property-content-info property-content-info-comm").text# 房源地址item1 = [title,room_num,area,price,house_age,call_name,house_addr]# 将各个信息放入item1列表中house_items.append(item1)# 将每个列表添加到house_items列表中,用于下步存储return house_items#返回house_items的值

所有数据已经拿到了,接下来就是要将我们拿到的数据存到本地,用csv模块便能实现,打开的文件最后一定要记得关闭。

def House_File(house_items):# 定义一个存储数据的文件,并传入我们要存储的数据house_file = open('house_price.csv','w',newline='',encoding='gbk')# 打开一个名为house_price.csv的文件(没有则会创建),w为写入模式,newline=''区分换行符,encoding='gbk'表示编码格式line = ['名称','房型','面积','价格','建造年份','联系人','地址']w = csv.writer(house_file)# 用csv.writer()函数创建一个w对象w.writerow(line)# 在第一行写入line列表的信息for house_item in house_items:# 用遍历house_items得到每个房源的信息w.writerow(house_item)# 逐行写入house_file.close()# 关闭文件

数据和存储的代码都搞定,接下来就是启动整个项目啦!

task_list = []# 创建一个任务列表for x in range(5):# 创建5只爬虫来为我们服务task = gevent.spawn(House_Spider,work)# 创建一个任务tasktask_list.append(task)# 将任务全部导入任务列表gevent.joinall(task_list)# 启动任务列表内的任务start = time.time()# 记录项目开始时间print('任务开始'.center(20,'-'))# 程序开始house_items = House_Spider()# 提取数据,解析数据,筛选拿到想要的数据House_File(house_items)# 将数据存储到本地end = time.time()# 记录结束时间print('任务完成'.center(20,'-'))# 程序结束print('共耗时:{:.2f}秒'.format(end-start).center(20,'-'))# 打印共消耗的时间

最后运行的结果为: 在这里插入图片描述

四、代码整合 #获取前十页的二手房源的 名称 价格 几房几厅 大小 建造年份 联系人 地址 标签 # url : https://fuzhoushi.anjuke.com/sale/from gevent import monkeymonkey.patch_all() import random,csv,gevent,timeimport requestsfrom bs4 import BeautifulSoupfrom fake_useragent import UserAgentfrom gevent.queue import Queuework = Queue()# 创建队列对象,并赋值给work。for pag in range(10):# 利用循环将前十页的网址获取到url_list = 'https://fuzhoushi.anjuke.com/sale/p'+str(pag)work.put_nowait(url_list) # 把构造好的网址用put_nowait方法添加进列表里def House_Spider():# 定义House_Spider函数house_items = []# 创建一个空列表,到时候用来装各个信息pagnum = 0# 页码while not work.empty():# 当列表不是空的时候,执行下面的程序pagnum += 1print('正在爬取第{}页数据'.format(pagnum))# 显示正在爬取的页码url = work.get_nowait()headers= {'User-Agent':str(UserAgent().random)}# 随机获取请求头res = requests.get(url,headers=headers)# 获取网页源代码bs =BeautifulSoup(res.text,'html.parser')# 解析网页源码数据items = bs.find_all('div',tongji_tag="fcpc_ersflist_gzcount")# 提取每一个房源的全部信息for item in items:# 遍历循环items得到每个房源信息title = item.find('h3')['title']# 房源标题price = item.find('p',class_="property-price-total").text# 二手房价格room_num = item.find('p',class_="property-content-info-text property-content-info-attribute").text# 房子型号,即几室几厅area = item.find('div',class_="property-content-info").text.strip()[40:50]# 房子面积house_age = item.find('div',class_="property-content-info").text.strip()[-7:-1]#房子建造年份if house_age[-2:-1] != '年':house_age = '无'else:passcall_name = item.find('span',class_="property-extra-text").text# 联系人house_addr = item.find('div',class_="property-content-info property-content-info-comm").text# 房源地址item1 = [title,room_num,area,price,house_age,call_name,house_addr]# 将各个信息放入item1列表中house_items.append(item1)# 将每个列表添加到house_items列表中,用于下步存储return house_itemsdef House_File(house_items):# 定义一个存储数据的文件,并传入我们要存储的数据house_file = open('house_price.csv','w',newline='',encoding='gbk')# 打开一个名为house_price.csv的文件(没有则会创建),w为写入模式,newline=''区分换行符,encoding='gbk'表示编码格式line = ['名称','房型','面积','价格','建造年份','联系人','地址']w = csv.writer(house_file)# 用csv.writer()函数创建一个w对象w.writerow(line)# 在第一行写入line列表的信息for house_item in house_items:# 用遍历house_items得到每个房源的信息w.writerow(house_item)# 逐行写入house_file.close()# 关闭文件task_list = []# 创建一个任务列表for x in range(5):# 创建5只爬虫来为我们服务task = gevent.spawn(House_Spider,work)# 创建一个任务tasktask_list.append(task)# 将任务全部导入任务列表gevent.joinall(task_list)# 启动任务列表内的任务start = time.time()# 记录项目开始时间print('任务开始'.center(20,'-'))# 程序开始house_items = House_Spider()# 提取数据,解析数据,筛选拿到想要的数据House_File(house_items)# 将数据存储到本地end = time.time()# 记录结束时间print('任务完成'.center(20,'-'))# 程序结束print('共耗时:{:.2f}秒'.format(end-start).center(20,'-'))# 打印共消耗的时间 五、更多

还有很多地方可以改进,比如可以用一个input来替代网页中的beijing,可以搜索自己想搜索的城市等等。

虽然东西不多,但刚开始学习,以后也会慢慢的多写一点,希望能和大家一起进步~ 我也只是个菜鸟,文中错误的地方,欢迎拍砖~

免责声明:非本网注明原创的信息,皆为程序自动获取自互联网,目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责;如此页面有侵犯到您的权益,请给站长发送邮件,并提供相关证明(版权证明、身份证正反面、侵权链接),站长将在收到邮件24小时内删除。

相关阅读