scrary爬取---新浪新闻

创建名令:
1 scrapy startproject Myspider
2 scrapy genspider sina sina,com
在这里插入图片描述

在这里插入图片描述
spider下面sina里面的代码

import scrapy
import re
#导入items类,用于实例化对象,将字段存入items
from mySpider.items import MyspiderItem
#新建一个爬虫类,用于继承spider`
class XiaChuFang(scrapy.Spider):
    #定义爬虫名称
    name = 'xcf'
    #定义爬虫起始的url
    start_urls=["http://www.xiachufang.com/category/40076/"]
    #定义解析response的parse函数
    def parse(self, response):
        # print(response)
        # html=response.body.decode('utf-8')
        # print(html)
        # with open('xcf.html','w',encoding='utf-8') as f:
        #     f.write(html)
        #首先缩小范围:
        li_list=response.xpath('//div[@class="pure-u-3-4 category-recipe-list"]//div[@class="normal-recipe-list"]/ul[@class="list"]/li')
        # print(len(li_list))
        # print(li_list)
        #循环遍历每一个li标签
        for li in li_list:
            #爬取图片:
            pic=li.xpath('.//img/@data-src').extract()[0]
            # print(pic)
            # print(type(pic))
            pic=re.sub('[@?](.*)','',pic)
            # print(pic)
            #获取名称
            food_name=li.xpath('.//p[@class="name"]/a/text()').extract()[0].strip()
            food_name=re.findall("[\u4e00-\u9fa5|a-z|\w]+",food_name,re.I)[0]
            # print(food_name)
            # print(food_name)
            #获取分数
            score=li.xpath('.//span[@class="score bold green-font"]/text()').extract()
            score=float(score[0]) if score else  0.0
            # print(score)
            #获取原料
            food_source=li.xpath('.//p[@class="ing ellipsis"]//text()').extract()
            food_source=''.join(food_source).strip()
            food_source = re.findall("[\u4e00-\u9fa5|a-z|\w]+", food_source, re.I)[0]
            # print(food_source)
            #昵称
            nick_name=li.xpath('.//p[@class="author"]/a/text()').extract()[0]
            # print(nick_name)
            #获取深度爬取的url
            detail_url = li.xpath('.//p[@class="name"]/a/@href').extract()[0]
            detail_url='http://www.xiachufang.com'+detail_url
            # print(detail_url)

            #实例化item类,将字段存入item
            item = MyspiderItem()
            #item类型是一个类似于字典类型
            # print(item)
            item['pic']=pic
            item['food_name']=food_name
            item['score']=score
            item['food_source']=food_source
            item['nick_name']=nick_name
            item['detail_url']=detail_url
            #返回使用 yield 返回给pipelines
            #触发pipelines文件中process_item
            #url表示进一步爬取的url,callback表示回调函数,接受详情url返回的界面。
            #meat表示传递给parse函数的列表页数据。
            # dont_filter  True表示不对url过滤,爬过的可以重复爬取。
            #yield是一个迭代器。使用yeild可以让我们的函数继续执行,return会直接结束函数
            #使用yeild可以不用等待上一次运行结束就可以开始运行。
            yield scrapy.Request(url=detail_url,callback=self.parse_detail,
                                 meta={'data':item},dont_filter=False)


        #获取下一页的url
        next_page_url=response.xpath('//a[@class="next"]/@href').extract()
        print(next_page_url)
        #最后一页为空直接跳过结束。
        if next_page_url:
            #拼接完整的下一页url
            next_page_url="http://www.xiachufang.com"+next_page_url[0]
            # print(next_page_url)
            #递归调用自己
            yield scrapy.Request(url=next_page_url,callback=self.parse)

    #解析详情页信息
    def parse_detail(self,response):

        # print(response.meta)
        # print(response.url)

        # 接受item参数
        item=response.meta['data']
        # print(item)
        #做过这道菜的人数
        cooker_number=response.xpath('//div[@class="cooked float-left"]//span[@class="number"]/text()').extract()[0]
        # print(cooker_number)

        cooker_method=response.xpath('//div[@class="steps"]/ol//li//p[@class="text"]/text()').extract()
        cooker_method='|'.join(cooker_method)
        cooker_method = re.findall("[\u4e00-\u9fa5|a-z|\w\|]+", cooker_method, re.I)
        cooker_method=''.join(cooker_method)
        # print(cooker_method)
        # print(cooker_method)

        #将数据放入item中,然后返回给pipelins中
        item['cooker_number']=int(cooker_number)
        item['cooker_method']=cooker_method
        yield item

item里面的定义代码

import scrapy


class CarspiderItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    pic=scrapy.Field() #图片
    title=scrapy.Field()# 标题
    price=scrapy.Field()# 价格
    details_url=scrapy.Field()#详情页
    sourse_id=scrapy.Field()#车源号
    pic_list=scrapy.Field()#详情页图片列表
    regist_time=scrapy.Field()#注册时间
    ckg=scrapy.Field()#注册时间

管道里面的代码,包括写入数据库

import pymongo
class MyspiderPipeline(object):
    def __init__(self):
        self.count=1
        self.db=self.conn_mongo()
    def conn_mongo(self):
        client=pymongo.MongoClient(host='127.0.0.1',port=27017)
        #选择数据库:
        return client.sina
    def process_item(self, item, spider):
        print(self.count,item)
        #将item存入Mongo数据库中
        self.db.sina.insert(dict(item))
        self.count += 1
        return item

打开setting里面的中间件
在这里插入图片描述
打开管道
在这里插入图片描述
规定的true 改成false
在这里插入图片描述

启动名令
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值