**
一,整体规划:
**
1,要爬取的网站是:https://list.tmall.com/search_product.htm?q=Ůװ
2,要爬取的信息是:商品名称,商品价格,商品链接,店铺名称,店铺信息
(good_name, good_price, good_url, shop_name, shop_url)
二,确定网站可以被访问,相关信息可以被提取
1,打开cmd窗口。输入
scrapy shell https://list.tmall.com/search_product.htm?q=Ůװ
回车
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才不正常呢,程序员是在不断试错中成长的,加油!