创建名令:
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
启动名令