scrapy分页抓取网页(基于python的scrapy框架完成的spider分析网站源码需要爬取)

优采云 发布时间: 2021-10-02 04:04

  scrapy分页抓取网页(基于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没写,不是难点,有时间我再优化一下,今天比较忙,所以我们先做吧~)

  写到最后,有问题的朋友欢迎加我~

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线