scrapy分页抓取网页(基于python的scrapy框架完成的spider分析网站源码需要爬取)
优采云 发布时间: 2021-10-02 04:04scrapy分页抓取网页(基于python的scrapy框架完成的spider分析网站源码需要爬取)
磕磕绊绊,爬了很多次,尝试了很多次,看了很多前辈的文章,终于在探索中领悟了。接下来,我将详细记录我的想法和详细代码。截止2020年7月18日,可以正常爬取了,接下来请听我说~
本项目基于python的scrapy框架。要想跑通,首先得安装python环境,搭建python环境。这个文章我就不详细介绍了,开始吧!
安装scrapy框架,一般如果你网速好,可以直接安装!
pip安装scrapy
明确我们的需求:
爬取链家北京二手房前100页数据分析。抓取链接为下一页做准备。需要抓取哪些数据来分析网页源代码
需要爬取的链接如下:
/ershoufang/ 首页链接/ershoufang/pg2/ 第二页/ershoufang/pg3/ 第三页
通过对比爬取链接,我们发现之前的链接基本相同,唯一不同的是最后一个数字,最后一个数字代表哪个页面,知道这些之后我们就可以开始创建scrapy项目了。
创建项目
scrapy startproject lianjia # 创建一个名为lianjia的爬虫项目
cd lianjia #进入新创建的项目
scrapy genspider lianjia_spider # 创建连家蜘蛛
解析网站的源码
发现list页需要的数据在li标签里,继续分析,因为我们这个项目的爬取思路是爬取标题,获取到标题中的链接,然后到详情页去继续爬取数据,通过定位到详情页的入口,我们往下走,进入详情页。
我发现详情页这两个地方的数据大都差不多。你想爬取哪些数据取决于读者的兴趣。我需要这两个地方的数据,所以会涉及到下面的一些项目。
编写一个scrapy项目
我用的编辑器是pycharm,一直用JB的产品,整体体验还是不错的。
根据自己的需要写item,方便以后写CSV、json、MySQL等
编写item,
class LianItem():
# 名称
title = scrapy.Field()
# 房屋类型
room_form = scrapy.Field()
# 房屋面积
size = scrapy.Field()
# 朝向
room_type = scrapy.Field()
# 几居室
main_info = scrapy.Field()
# 总价
total_price = scrapy.Field()
# 单价
unit_price = scrapy.Field()
# 小区
community = scrapy.Field()
# 区域
area = scrapy.Field()
# 装修情况
decorate = scrapy.Field()
# 挂牌时间
hangtag = scrapy.Field()
# 上次交易时间
last_time = scrapy.Field()
# 房屋年限
room_year = scrapy.Field()
# 抵押状态
pledge = scrapy.Field()
写spider(这是重点)
修改设置
ROBOTSTXT_OBEY = False # 不遵守爬虫协议
DEFAULT_REQUEST_HEADERS = {
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'Accept-Language': 'en',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.106 Safari/537.36' } # 伪造浏览器请求头
ITEM_PIPELINES = { 'lian.pipelines.LianPipeline': 300, } # 开启我们的管道,本项目是将爬取到的数据存入CSV文件
将管道写入 CSV
def __init__(self):
# 打开文件,指定方式为写,利用第3个参数把csv写数据时产生的空行消除
self.f = open("lianjia_new.csv", "a", newline="")
# 设置文件第一行的字段名,注意要跟spider传过来的字典key名称相同
# self.fieldnames = ["place", "size", "price"]
self.fieldnames = [
"title", "room_form", "size", "room_type", "main_info",
"total_price", "unit_price", "community", "area", "decorate"
, "hangtag", "last_time", "room_year", "pledge",
]
# 指定文件的写入方式为csv字典写入,参数1为指定具体文件,参数2为指定字段名
self.writer = csv.DictWriter(self.f, fieldnames=self.fieldnames)
# 写入第一行字段名,因为只要写入一次,所以文件放在__init__里面
self.writer.writeheader()
def process_item(self, item, spider):
# 写入spider传过来的具体数值
self.writer.writerow(item)
# 写入完返回
return item
def close(self, spider):
self.f.close()
进入项目目录,启动爬虫
scrapy crawl 爬虫名称
运行后,你会发现你的项目中多了一个CSV文件,大功告成。(最后看了几张没抓到的数据,应该是xpath没写,不是难点,有时间我再优化一下,今天比较忙,所以我们先做吧~)
写到最后,有问题的朋友欢迎加我~