**
一,整体规划:
2,要爬取的信息是:商品名称,商品价格,商品链接,店铺名称,店铺信息
(good_name, good_price, good_url, shop_name, shop_url)
二,确定网站可以被访问,相关信息可以被提取
1,打开cmd窗口。输入
2,紧接着输入view(response)回车
它就会自动打开那个网站,并且下面返回True
3,看能否获得相关内容
输入response.xpath(’//[@id=“J_ItemList”]/div[1]/div/p[2]/a/text()’).extract()
注解:xpath(’//[@id=“J_ItemList”]/div[1]/div/p[2]/a/text()’)是你要获取获取元素的xpath路径,你可以通过
**(打开网站——》按F12——》点击代码框左上角的箭号——》在网页中选择你要获取的元素——》这时代码框就会出现你选择元素的代码位置,选择它右击——》copy——》copy Xpath)**如果是想要提取内容的话,可以在后面加上 /text(),并调用提取函数extract()
三,编写scrapy
- 生成项目
选择文件夹(你想要项目所处的文件夹),按住shift右击,选择——》在从此处打开powershell窗口。
输入scrapy startproject tmgoods 回车(这时就建立好了一个项目)
输入 cd tmgoods 回车(进入tmgoods这个文件夹)
输入 scrapy genspider tmgood tmall.com(建立一个名叫tmgood的爬虫,
并限定它爬取域为tmall.com) - 使用pycharm打开文件
file——》open——》tmgoods——》ok——》this window - 编辑item文件
import scrapy
class TmgoodsItem(scrapy.Item):
# define the fields for your item here like:
# name = scrapy.Field()
good_price = scrapy.Field()
good_name = scrapy.Field()
good_url = scrapy.Field()
shop_name = scrapy.Field()
- 编辑spider文件
#-*- coding: utf-8 -*-
import scrapy
from tmgoods.items import TmgoodsItem
class TmgoodSpider(scrapy.Spider):
name = 'tmgood'
allowed_domains = ['tmall.com']
start_urls = ['https://list.tmall.com/search_product.htm?q=%C5%AE%D7%B0']
#标记访问的个数
count = 0
def parse(self, response):
TmgoodSpider.count += 1
#这里的xpath路径不是copy得来的,你需要观察,网页中的代码结构,自己编写
#可以百度xpath选择器的用法
divs = response.xpath('//div[@id="J_ItemList"]/div[@class="product "]/div')
if not divs:
self.log("list page error--%s" % response.url)
#log是一个日志属性,有标记功能,这里的作用是标记url错误的页面
for div in divs:
item = TmgoodsItem()
#实例化一个TmgoodsItem()对象
#商品价格
item['good_price'] = div.xpath('p[@class="productPrice"]/em/@title')[0].extract()
#商品名称
item['good_name'] = div.xpath('p[@class="productTitle"]/a/@title')[0].extract()
#商品url
good_url = div.xpath('p[@class="productTitle"]/a/@href')[0].extract()
#因为有的url路径前面没有“http:”,这样就保证了使用url路径都是有效的
item['good_url'] = good_url if "http:" in good_url else ("http:"+good_url)
#yield的作用于return相似,这里把二级页面的url,和这个页面保存的数据返回
#给self.parse_detail函数,继续解析
yield scrapy.Request(url=item['good_url'], meta={"item": item}, callback=self.parse_detail, dont_filter=True)
#接收上个函数的返回值,进行解析
def parse_detail(self, response):
div = response.xpath('//div[@class="extend"]/ul')
if not div:
self.log('Detail page error--%s' % response.url)
#继承上个函数的item,并获得它的全部数据,这里可以理解成赋值(属性和数据的赋值)
item = response.meta['item']
div = div[0]
item['shop_name'] = div.xpath('li[1]/div/a/text()')[0].extract()
item['shop_url'] = div.xpath('li[1]/div/a/@href')[0].extract()
item['company_name'] = div.xpath('li[3]/div/text()')[0].extract()
item['company_address'] = div.xpath('li[4]/div/text()')[0].extract()
#最终返回item(这里有所有保存的item['']数据)
yield item
- 编辑setting文件
因为淘宝在robot协议中是规定,不予许被scrapy爬取的
如果你想爬取的话需要在setting中找到 ROBOTSTXT_OBEY = True
改为ROBOTSTXT_OBEY = False
这样你就不遵循robot协议了
运行代码,并将结果保存为result.csvwen文件
找到爬虫项目文件——》shift+右击——》选择打开powershell窗口——》
输入scrapy list 回车(检验有没有错误)出现爬虫的名字
输入scrapy crawl tmgood -o result.csv(运行爬虫,并open一个result.csv文件,把爬取的数据存进去)
最后
出现错误别灰心,这是很正常的,不出现bug才不正常呢,程序员是在不断试错中成长的,加油!