python网页数据抓取(一下爬虫爬虫项目的基本步骤和基本操作步骤(一))
优采云 发布时间: 2022-02-17 15:01python网页数据抓取(一下爬虫爬虫项目的基本步骤和基本操作步骤(一))
Python爬虫--scrapy爬虫框架介绍写在前面
在编写爬虫之前,我从未使用过爬虫框架。其实我之前写的就是一个爬虫写的小练习的demo。只能说是从网上抓取一点数据,直接用python脚本解决爬虫的所有功能。循环获取更多数据页。后来了解了代理池系统,稍微了解了一下,爬虫其实也算是一个项目。该项目分为模块。不同的模块负责不同的功能。有些模块负责封装http请求,有些模块负责处理请求。(数据采集),有些模块负责数据分析,有些模块负责数据存储。这样一个框架的原型已经出现,这可以帮助我们更加专注和高效地抓取数据。对于scrapy,一开始并不想过多解释scrapy框架各部分的组成和功能,而是直接在实际运行中感受一下框架是如何分工协作的,各个模块负责什么功能,最后关注一下这个框架。一些原则应该是学习scrapy框架的最好方法。
scrapy爬虫的基本步骤创建一个scrapy爬虫项目。创建一个 Spider 爬虫类来爬取网页内容并解析它。定义数据模型(Item)并将捕获的数据封装到Item中。使用Item Pipeline来存储和抓取Items,即数据实体对象。一、创建一个scrapy爬虫项目
安装scrapy后,运行命令scrapy startproject project name,创建scrapy爬虫项目。例如运行scrapy startproject test1会生成一个test1文件夹,目录结构如下:
二、创建一个Spider爬虫类来爬取网页内容并解析它。
爬虫的代码写在spider文件夹下,所以在spider目录下创建一个python文件,爬取方天下的数据,所以创建一个python文件,命名为ftx_spider.py。
接下来,开始在 ftx_spider.py 中编写爬虫代码:
import scrapy
class FtxSpider(scrapy.Spider):
"""
一、创建一个爬虫类,继承scrapy.Spider
二、通过name属性,给爬虫类定义一个名称
三、指定要抓取的网页链接urls,发送http请求
方式一:
1.继承scrapy.Spider的start_requests()方法。
2.指定要爬取的url,通过scrapy.Request(url=url, callback=self.parse)发送请求,callback指定解析函数。
方式二(简化):
1.直接通过start_urls常量指定要爬取的urls。
2.框架会自动发送http请求,这里框架默认html解析函数parse().
四、针对http请求的response结果,编写解析方法,parse()
"""
name = 'ftx'
# 方式一:通过scrapy.Request(url=url, callback=self.parse)发送请求,指定解析函数
# def start_requests(self):
# urls = ['http://wuhan.esf.fang.com/house-a013126/i3']
# for url in urls:
# yield scrapy.Request(url=url, callback=self.parse)
#
# def parse(self, response):
# # 这里对抓取到的html页面进行解析
# print(response.url)
# 方式二(简化版):通过start_urls,框架自动发送请求,默认解析函数为parse()
start_urls = ['http://wuhan.esf.fang.com/house-a013126/i3']
def parse(self, response):
print(response.url)
三、数据模型Item,定义爬取数据的数据结构
这个Item相当于java中的域实体,或者javabean。在 items.py 中定义了一个类,它继承了 scrapy.Item。这样我们就可以将我们抓取的数据封装到一个对象中。
import scrapy
class FtxSpiderItem(scrapy.Item):
# define the fields for your item here like:
title = scrapy.Field() # 标题
huxing = scrapy.Field() # 户型
size = scrapy.Field() # 面积
floor = scrapy.Field() # 楼层
fangxiang = scrapy.Field() # 方向
year = scrapy.Field() # 建房时间
shop_community = scrapy.Field() # 小区
address = scrapy.Field() # 地址
total_price = scrapy.Field() # 总价(万)
price = scrapy.Field() # 单价(万/m2)
四、使用Item Pipeline存储和抓取item并将数据存储在MongoDB中
项目管道是项目管道。当 Item 生成后,会自动发送到 Item Pipeline 进行处理。
首先在setting.py中添加MongoDB数据库连接信息
# MongoDB
HOST = 'localhost'
PORT = 27017
DB_NAME = 'ftx'
COLL_NAME = 'roomprice'
然后在pipelines.py中创建一个类,连接数据库,插入数据
import pymongo
from scrapy.conf import settings
class FtxSpiderPipeline(object):
def __init__(self):
# 连接MongoDB
self.client = pymongo.MongoClient(host=settings['HOST'], port=settings['PORT'])
# 获取数据库
self.db = self.client[settings['DB_NAME']]
# 获取集合
self.collection = self.db[settings['COLL_NAME']]
def process_item(self, item, spider):
self.collection.insert(dict(item))
最后在setting.py中指定Item Pipeline使用的类和优先级
ITEM_PIPELINES = {
'ftx_spider.pipelines.FtxSpiderPipeline': 300
}
运行命令行scrapy crawl 'crawler name name',可以发现数据已经成功存入数据库daacheng/PythonBasic