北京新发地
新发地-价格行情
前提:安装有scrapy
打开pycharm,点击Terminal,输入scrapy startproject name
ps:name为你要创建的工程的名字
如下:我创建的scrapy工程名为bjxfd,即北京新发地的拼音缩写
scrapy startproject bjxfd
之后会自动生成目录和一系列文件
这时提示你需要创建源文件
先cd 工程文件名 进入scrapy工程目录
然后使用scrapy genspider scrapyname www.xxx.com
scrapy genspider scrapyname www.xxx.com
其中,scrapyname为爬虫名,自己定义,www.xxx.com是要爬取网站的域名网址
在scrapy工程目录里,我们可以看到多了一个你刚刚创建的name的名字,比如我刚刚创建的爬虫文件名为xfd,这就多了个xfd.py文件,用于写爬虫代码的
到这里我们的项目就建好了,可以开始写代码了
根据网页源代码结构查看,发现数据是在json内,且为post请求
根据分析可得,http://www.xinfadi.com.cn/getPriceData.html为具体数据的基础url
http://www.xinfadi.com.cn/getPriceData.html?limit=20¤t=1的url中,limit参数为一页数据量为20条数据,current为页数
文件目录结构
settings.py
# 种类,名字,最低价,最高阶,平均价,规格,产地,单位,发布时间
FEED_EXPORT_FIELDS = ['kind', 'name', 'lowPrice', 'highPrice', 'avgPrice', 'norms', 'place', 'unit', 'date']
# 屏蔽一些日志信息
LOG_LEVEL='WARNING'
items.py
代码如下:
import scrapy
# 种类,名字,最低价,最高阶,平均价,规格,产地,单位,发布时间
class XinfadiItem(scrapy.Item):
kind = scrapy.Field()
name = scrapy.Field()
lowPrice = scrapy.Field()
highPrice = scrapy.Field()
avgPrice = scrapy.Field()
norms = scrapy.Field()
place = scrapy.Field()
unit = scrapy.Field()
date = scrapy.Field()
spiders.py
代码如下:
import scrapy
import json
from ..items import XinfadiItem
class XfdSpiderSpider(scrapy.Spider):
name = 'xfd_spider'
allowed_domains = ['www.xinfadi.com.cn']
start_urls = 'http://www.xinfadi.com.cn/priceDetail.html'
def start_requests(self):
max = 10
for page in range(1, max+1):
urls = f'http://www.xinfadi.com.cn/getPriceData.html?limit=20¤t={page}'
yield scrapy.Request(urls, callback=self.parse)
def parse(self, response):
json_data = json.loads(response.text)['list']
for i in json_data:
item = XinfadiItem()
item['kind'] = i['prodCat']
item['name'] = i['prodName']
item['lowPrice'] = i['lowPrice']
item['highPrice'] = i['highPrice']
item['avgPrice'] = i['avgPrice']
item['norms'] = i['specInfo']
item['place'] = i['place']
item['unit'] = i['unitInfo']
item['date'] = i['pubDate']
yield item
运行结果如下
执行爬虫程序,在Terminal中执行scrapy crawl 爬虫文件名
scrapy crawl xfd